Datenformate und Zeichensätze

tempa wrote this 01:11:

Am Anfang einer HTML- und PHP-Karriere glaubt man noch, dass einem der Bit-, Windows, Linux und Unix-Kram egal sein kann, auch der Charset lässt einen kalt. Man übernimmt noch den Charset, z.B. den Windows-1252, im Head-Meta-Tag der HTM-Datei, weil das alle so machen. Und dann nutzt man ein Sonderzeichen, das z.B. ISO-8859-1 Charset nicht abgedeckt ist oder übernimmt Daten direkt per include von Kunden, die ein anderes Format haben als das Windows basierende erweiterte ASCII namens ANSI verwendet und in UTF-8 mit oder ohne BOM gespeichert wurde und vica versa oder will Maildaten auswertern und stolpert über den Unterschied zwischen 8 und 7 Bit.

Die folgenden Zahlensysteme in der Tabelle unten dienen in Computersystemen dem Ausdruck und der Repräsentation von Sympolen und Operationen. Der Computer – so wissen wir – unterscheidet zwei Zustände, aus und an oder Binär ausgedrückt 0 und 1. In einem Bit speichert der Computer 8 Mal entweder die 0 oder die 1 und drückt so z.B. Dezimalwerte oder unser Alphabet aus. sämtliche noch so komplexe Ausdrücke im Computer können zurückgeführt werden auf eine Kombination von 0 und 1 in Bits und Bytes. Wieviele Stellen, ob 8, 16, 32, 64 oder 128, was repräsentieren, ist dabei eine Frage des Systems.

Wir Menschen beginnen das Zählen und Rechnen mit dem Dezimalsystem und lernen die Zahlen von 0 bis 9 und dass mit 10 und jeder weiteren Stelle um Faktor 10 erweitert wird, 100, 1’000, etc.. Unser Dezimalsystem kann hergenommen werden um Buchstaben zu repräsenetieren, z.B. 5 = E denn E steht an der 5. Stelle in unserem Alphabet. In Computersystemen wird das Dezimalsystem allerdings gewöhnlich nicht verwendet, um Buchstaben aus dem Alphabet zu repräsentieren. Ein Datum begegnet einem da schon des öfteren als verwirrend lange Zahl aus dem Dezimalzahlensystem, nur gut dass uns Funktionen zur Verfügung stehen, die aus der Zahl wieder ein konventionelles, für uns menschen lesbares, Datum wandelt.

Auch das Hexadecimalsystem ist den Meisten, die schon mit HTML und CSS Webseiten erstellt haben, begegnet. In der Regel wird der RGB-Wert hexadezimal ausgedückt #FFFFFF = Rot: 255 Gelb: 255 Blau: 255. Das Hexadezimalsystem 24 (=256) eignet sich um übersichtlich für Mensch halbwegs lesbar das Binäre 28 abzubilden. Siehe hierzu auch den Beitrag auf Bigwhoop: Wieso nutzen wir eigentlich das Hexadezimalsystem?

Das oktale System ist wie das Binärsystem ein Sysetm, das einem direkt und offensichtlich kaum begegnet. Einmal von mexikanischen Yukis abgesehen, die ihre acht Handknöchel statt der zehn Finger zum Zählen nutzen, eignet sich das Base-8 Zahlensystem in Computer, weil eine Oktalzahl durch drei Bit dargestellt werden kann und dem geminen PHP-Dabbler im Mailverkehr begegnet.

Dezimal 0 1 2 3 4 5 6 7 8 9
Hexadezimal 0 1 2 3 4 5 6 7 8 9
Oktal 0 1 2 3 4 5 6 7 10 11
Binär (dual) 0 1 10 11 100 101 110 111 1000 1001
Dezimal 10 11 12 13 14 15 16  
Hexadezimal A B C D E F 10  
Oktal 12 13 14 15 16 17 20  
Binär (dual) 1010 1011 1100 1101 1110 1111 10000       

Was passiert wenn man unversehens mit dem Octalsystem rechnet?

  1. var_dump($a = 010); // 8
  2. var_dump($b = 0xA); // 10
  3. var_dump($c = 2); // 2
  4. print $a + $b + $c; // 20

Statt 10 + 10 + 2 = 22 hat man folgende Addition aufgemacht 8 + 10 + 2 = 20 (gefunden auf php.dzone.com: PHP Data Types – Octal Notation)

Mittels den 2-Base (Binary), 8-Base (Octal), 10-Base (Decimal) und 16-Base (Hexadecimal) werden wie bereits geschrieben dazu genutzt etwas zu repräsentieren, u.a. Zeichensätze. Hier haben sich je nach länderspezifisch genutztem Zeichensatz im Laufe der Jahre unterschiedliche Systeme entwickelt und je stärker der internationale Datenaustausch in die Gänge kam, desto wichtiger wurde ein einheitliches, länderübergreifendes System notwendig und so wurde statt der diversen „ISO-…“ Zeichensätze der UTF-8 Zeichensatz populär. Ein Zeichen wird je nach System direkt Binär, octal oder hexadezimal im Hintergrund des Programmes (z.B. Texteditor, Browser, etc.) dargestellt. Im Falle von UTF-8 kommt noch hinzu, dass einige Systeme (Editoren) dem Text eine UTF-8 Kennung voranstellen, dem BOM (= Byte Order Mark), was die Entzifferung des UTF-8 beeinflusst und um Fehler zu vermeiden sollte eine unbekannte, fremde, externe UTF-8 Textquelle auf das Vorhandensein des BOM geprüft und entsprechendes ggf. entfernt werden.

  1. $str = file_get_contents('extern_utf8.txt');
  2. $bom = pack("CCC", 0xef, 0xbb, 0xbf);
  3. if (0 == strncmp($str, $bom, 3)) {
  4. // BOM detected, remove BOM:
  5. $str = substr($str, 3); }

Wer nicht aufpasst, hat schnell einen Buchstabensalat auf dem Monitor. Das kann selbst dem Präsidenten der USA in einem sehr öffentlichen Forum passieren. Siehe: Why the #AskObama Tweet was Garbled on Screen

Gründe für den Zeichensalat sind sowohl in den Bit-Systemen, den Zeichsätzen und an einleitenden Datei-Markern wie z.B. BOM zu suchen und das Problem wird uns sicher noch lange begleiten.

Leave a Reply