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.

Alles läuft im Browser — der Prüfknopf weiter unten rechnet den ganzen Vorrat durch
Die vier Formen führende Bits sagen die Länge
Zeichen einsetzen Zahl im Bereich 0–10FFFF, hexadezimal oder dezimal — oder einfach ein Zeichen.
Übersetzer
Zeichen
Codepunkte
UTF-16
Einheiten, was .length zählt
Bytes
so viel wiegt der Text
Kosten je Zeichen
Bytes ÷ Zeichen

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.

1 Byte 2 Bytes 3 Bytes 4 Bytes Bytes je Zeile 16
Fallen, die jeder schon erlebt hat

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.

Beweis statt Behauptung

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