Hallo Nils,
Ich gebe nun beispielsweise den Buchstaben "ü" in das Textfeld ein. Hängt das nun von der im meta-tag angegebenen Zeichenkodierung ab, wie der Buchstabe binär im Textfeld gespeichert wird?
Wie Dir schon gesagt wurde, ist es völlig wurst, wie die Browser so etwas intern speichern. Tatsächlich verwenden die meisten aber anscheinend wirklich eine Unicode-Kodierung für Strings, soweit ich weiss.
Wenn nein, liege ich da richtig, das der Buchstabe immer in der Unicode-Codierung (in diesem Fall 0000 0000 1111 1100)gespeichert wird??
Nein.
Du hast hier eine Umrechnungsfehler. Hier mal ein kleiner Crashkurs in der Unicode-Kodierung UTF-8. Die ja nur eine von mehreren binären Kodierungen von Unicode Zeichen ist.
Das kleine Ü hat im Unicode Zeichensatz folgenden Code-Point: U+FC. So ein Code-Point ist eigentlich nur eine Indexnummer, an welcher Stelle im Zeichensatz sich ein Zeichen (Buchstabe) befindet. Traditionell wird die Nummer in hexadezimaler Notation benutzt (dezimal wäre sie 252), davor wird dann das "U+" gesetzt.
Nun könnte man diese Code-Point einfach in Binärschreibweise umrechnen, das hast Du ja auch getan, die hexadezimale Zahl FC ist 11111100 in Binärschreibweise. Hier sind das praktischerweise acht Bits, also das üblicherweise benutzte klassische Byte. Nur: Bei höheren Code-Points wird die Binärschreibweise natürlich immer länger. Und Bytes haben eine feste Länge, sonst kommt man ja durcheinander und weiss nicht, wo das eine Zeichen aufhört und das andere anfängt. Du hast jetzt einfach acht binäre Nullen davor gesetzt: 00000000 11111100, hast also zwei Bytes. Das ist aber die Kodierung UTF-16, nicht die Kodierung UTF-8. Unicode definiert mehrere, verschiedene Kodierungen, um aus einer Zahl tatsächliche Bytes zu kriegen. Die langweiligste ist UTF-32, da wird jeder Code-Point eines Buchstabens in vier Bytes (= 32 Bit) kodiert, für das kleine Ü sieht das dann so aus:
00000000 00000000 00000000 11111100
Ganz viele Nullen im Speicher oder im Kabel also. UTF-16 ist mit dem Platzverbrauch etwas geschickter. Da werden Code-Points, die mit nur 16 Bit, also zwei Byte kodiert werden können, auch nur mit zwei Bytes kodiert. Praktischerweise betrifft das so gut wie den meisten Text, der da draussen existiert. Code-Points, die sich nicht durch 16 Bit binär kodieren lassen, werden dann mit zwei mal zwei Bytes kodiert. Durch ein geschicktes Verfahren werden die 16+ Bits so in 32 Bit untergebracht, dass sie nicht mit normalen 16 Bit großen binären Kodierungen von Code-Points verwechselt werden können. Das heisst: In UTF-16 kodierte Code-Points von Zeichen sind immer zwei Bytes groß – es sei denn, sie sind vier Bytes groß. Stressig, oder?
Ich weiche nur so lange vom eigentlichen Thema ab, weil ein ähnliches Prinzip bei der Kodierung UTF-8 benutzt wird, nur viel intensiver. Und UTF-8 war die Kodierung, die Du eigentlich angegeben hast. Fangen wir am Anfang an: Das Zeichen des kleinen Üs hat den Code-Point U+FC. In Binärschreibweise ist das die Zahl 11111100. Das sind acht Bit, das erste Bit ist eine Eins. UTF-8 wurde aber mit genau dem Ziel geschaffen, dass die bisherigen Bytes, die Zeichen im ASCII-Zeichensatz darstellen auch die gleichen Zeichen im Unicode-Zeichensatz ergeben.
Zur Erinnerung: Der ASCII-Zeichensatz hat nur 128 Zeichen, die sich in Binärschreibweise durch sieben Bit kodieren lassen. Als Byte ist dann das erste Bit eine Null. Sinnigerweise sind die ersten 128 Zeichen im Unicode Zeichensatz gleich den 128 Zeichen des ASCII-Zeichensatzes. Für diese gilt in der Kodierung UTF-8 also die Regel: „In die Binärschreibweise umrechnen, ein Nullbit davor setzen“. Das Problem kommt dann bei den anderen 1.113.986 Zeichen des Unicode Zeichensatzes. Wandelt man die in Binärschreibweise um, sprengt man wieder die Grenzen eines Bytes. Damit man weiss, wo ein Zeichen beginnt und endet, braucht man wieder eine Regel, um zu wissen, welche Bytes zusammen ein Zeichen bestimmen. Dazu muss man seine Bits der Binärschreibweise des Code-Points richtig in Bytes umwandeln. UTF-8 macht das vereinfacht dargestellt im wesentlichen mit vier Regeln:
(1) Wenn sich der Code-Point des zu kodierenden Zeichens zwischen 0 und 1111111 (hexadezimal: 0–7F) befindet, füge die Bits in dieses Byte ein: 0xxxxxxx
Das ist unsere ASCII-Kompabilitätsregel. Mal exemplarisch am Beispiel des Plus-Zeichens durchgeführt: Das Plus-Zeichen hat den Code-Point U+2B, in Binärschreibweise lautet die Zahl 101011. Diese wird nun in obiges Byte eingefügt, der überschüssige Platz davor wird mit Nullen (hier nur einer) aufgefüllt:
0xxxxxxx
101011
0
--------
00101011
Damit haben wir unser Byte für das Zeichen "+". Die anderen drei Regeln gehen genauso, nur dass sie statt einem zu füllenden Byte mehrere benutzen:
(2) Wenn sich der Code-Point des zu kodierenden Zeichens zwischen 10000000 und 11111111111 (hexadezimal: 80–7FF) befindet, füge die Bits in diese zwei Bytes ein: 110xxxxx 10xxxxxx
(3) Wenn sich der Code-Point des zu kodierenden Zeichens zwischen 100000000000 und 1111111111111111 (hexadezimal: 800–FFFF) befindet, füge die Bits in diese drei Bytes ein: 1110xxxx 10xxxxxx 10xxxxxx
(4) Wenn sich der Code-Point des zu kodierenden Zeichens zwischen 10000000000000000 und 100001111111111111111 (hexadezimal: 10000–10FFFF ) befindet, füge die Bits in diese vier Bytes ein: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(Theoretisch geht bei Regel (4) noch mehr, der aktuelle Standard begrenzt die Menge jedoch)
UTF-8 ist also noch komplizierter als UTF-16, denn hier lautet die Faustregel „Ein mit UTF-8 kodiertes Zeichen hat ein Byte, es sei denn, es hat zwei. Oder drei. Oder vier Bytes.“
Aber das Gute ist: man kann immer erkennen, wozu ein Byte gehört. Alle in den Regeln (2) bis (4) angegebenen aufzufüllenden Bytes beginnen mit einer Eins als erstem Bit. So können sie nicht mit Bytes aus Regel (1) verwechselt werden. Bytes, die als zweites, drittes oder viertes Byte eines Zeichens dienen, beginnen immer mit "10", also einer Eins als erstem Bit und einer Null als zweitem Bit. Ein beginnendes Byte eines mit zwei Bytes kodierten Zeichens beginnt immer mit "110", ein beginnendes Byte eines mit drei Bytes kodierten Zeichens beginnt immer mit "1110" und ein beginnendes Byte eines mit vier Bytes kodierten Zeichens beginnt immer mit "11110". Geschickt, geschickt.
UTF-8 hat noch mehr Geschicktheiten, wie zum Beispiel das Byte Order Mark, das einem anzeigt, in welcher Reihenfolge die Bytes ankommen, aber das geht hier zu weit.
Rechnen wir noch eben den Code-Points (Hexadezimal: 0xFC, Binär: 0b11111100) des kleinen Üs in UTF-8 um:
0xFC liegt eindeutig zwischen 0x80 und 0x7FF, also kommt Regel (2) zum Einsatz:
110xxxxx 10xxxxxx | Die aufzufüllenden Bytes aus Regel (2)
11 111100 | 0xFC in binär, an die Stellen der x gesetzt
000 | Mit Nullen auffüllen
-----------------
11000011 10111100
Also sind die hexadezimal notierten Bytes C3 BC die in UTF-8 kodierte Binärdarstellung des Zeichens "ü".
Tim