Blatt · Sprache & Maschine
Schriftcode — jedes Zeichen, Byte für Byte
Jedes Zeichen, das ein Rechner trägt, ist zuletzt eine Zahl, und UTF-8 ist die Regel, die aus diesen Zahlen Bytes macht — feste Folgen mit erkennbarem Bau. Der Vorrat ist dabei endlich: 1 112 064 Zeichen trägt Unicode insgesamt, die Surrogatstellen gar nicht mitgerechnet. Was endlich ist, lässt sich vollständig prüfen: Dieses Blatt codiert jeden einzelnen Wert von Hand, Bit für Bit, und hält das Ergebnis gegen den eingebauten Encoder des Browsers — der ganze Vorrat, beide Richtungen, keine Stichprobe.
Jedes Kärtchen ist ein Zeichen mit seinen Bytes; der Balken oben zeigt, wie viele es wurden. Anklicken für den Blick in die Bits.
Das letzte Bild der Familie sieht wie ein Ding aus und besteht doch aus sieben
Codepunkten; .length zählt UTF-16-Einheiten, keine Zeichen; und dasselbe é kann
als ein Zeichen oder als zwei daherkommen — gleiches Aussehen, verschiedene Bytes.
Der Vorrat an Zeichen ist endlich und abzählbar — also wird hier nicht gemust, sondern jeder einzelne Wert durchgerechnet: von Hand codiert, Byte für Byte gegen den eingebauten Encoder des Browsers gehalten, zurückgedeutet, und auf dem Rückweg jede kaputte Bytefolge vorgesetzt, die das Verfahren verwerfen muss. Dazu zwei Gegenproben: ein absichtlich verdorbener Codierer und der nachgiebige Dekoder, der still ersetzt, statt zu meckern — beide müssen ertappt werden, sonst würde die Prüfung nichts messen.
noch nicht geprüft
Warum sich hier alles prüfen lässt
Andere Blätter mustern, weil ihr Raum unendlich ist. Dieser Raum ist es nicht: Unicode hat 1 114 112 Stellen, davon 2 048 für Surrogate gesperrt — übrig bleiben genau 1 112 064. Ein endlicher Raum wird nicht gestichprobt, sondern durchgezählt: hin codiert, zurück gedeutet, und die Zählung muss mit der Theorie übereinstimmen. Tut sie das nicht, fehlt irgendwo etwas — und die Zeile wird rot, nicht leise leer.
Warum die Längen festliegen
UTF-8 ist ein Präfixcode: Die ersten Bits eines Bytes verraten, wie viele dazugehören —
0… eins, 110… zwei, 1110… drei, 11110… vier;
jedes Fortsetzungsbyte beginnt mit 10. Deshalb kann ein Deuter mitten im Strom
wieder einsteigen, deshalb sind Überlängen erkennbar (die kürzere Form wäre gültig gewesen)
und deshalb liegen die Anteile fest: 128 · 1 920 · 61 440 · 1 048 576 — gerechnet aus den
Bereichen, gezählt beim Durchlauf.
Der fremde Maßstab
Verglichen wird nicht mit sich selbst: TextEncoder und
TextDecoder sind die fertigen Implementierungen des Browsers, ein anderes Werkzeug
mit anderer Herkunft. Dazu kommen feste Proben aus der Unicode-Dokumentation mit
hingeschriebenen Bytes. Wenn eigene Bits, Browser und schriftliche Quelle übereinstimmen,
sprechen zwei unabhängige Zeugen — und die Gegenproben zeigen zusätzlich, dass der
Vergleich überhaupt anschlagen kann.
Eine einzelne HTML-Datei. Kein Build, keine Bibliothek, nichts verlässt den Browser. Alle Blätter: ssims437.github.io