Nieder mit Unicode! Warum 16 Bit pro Zeichen ein richtiger Schmerz im ASCII ist.

Uns wurde eine Lüge verkauft. Es ist an der Zeit, wieder auf 8-Bit umzusteigen. Die Zeiten bei denen es heisst Daumen Hoch Unicode sind definitiv vorbei.

Stop Ich habe kürzlich eine Damaszener Bekehrung erlebt, und wie viele dieser Bekehrten bin ich nun auf einen Kurs der wahllosen und aggressiven Proselytisierung festgelegt.

Meine Damen und Herren, stellen Sie Ihre Ohren in die gefühlvolle, gebogene Position und halten Sie sich bereit, um von der nächsten großen, einzigartigen, wahren Bewegung mitgerissen zu werden.

Der Anfang

Am Anfang – nun, nicht ganz am Anfang, offensichtlich, denn das würde eine angemessene Diskussion über Themen wie Parität und Fehlerkorrektur und Hamming-Distanzen erfordern; und den berühmten Streit zwischen den Brüdern ASCII, ISCII VISCII und YUSCII; und wie Sie in den 1980er Jahren, wenn Sie versuchten, ein £-Zeichen an einen fremden Drucker zu senden, den Sie vorher nicht angefreundet hatten (zum Beispiel, indem Sie ihm ein schönes neues Band kauften), waren Ihre Erfolgsaussichten vernachlässigbar; und, und, und…..

Aber du bist eine beschäftigte und wichtige Person.

So gab es am Anfang, der in der begrenzten Welt der späten MS-DOS- und frühen Windows-Programmierung begann, O beste Geliebte, diese Dinge, die man “Codepages” nannte.

Für den untätigen englischsprachigen Windows-Programmierer (d.h. mich) waren Codepages etwas Schreckliches und Aufgeblasenes, das man mit dem Ignorieren davonkommen wollte. Ich war mir nur schwach bewusst, dass es notwendig war, die Codepage zu wechseln und manchmal, verdammt nochmal, zwei Bytes pro Zeichen statt nur einem zu verwenden, um Zeichenketten in einigen der zierlicheren Fremdsprachen zu verarbeiten. Es war schlimm genug, dass sie nicht entscheiden konnten, wie viele Zeichen es brauchte, um das Ende einer Zeile zu markieren.

Ich wollte nachdrücklich nichts davon, und ich war nicht allein.

Also legten wir unsere Köpfe nieder und hielten uns an unsere Codepage – unseren 8-Bit-Zeichensatz -, der nach dem englischen Imperialismus-Algorithmus gestaltet wurde, der erstmals vom berühmten 1960er Jahre-Songster Michael Flanders identifiziert wurde.

(Flandern hatte bemerkt, dass es nur zwei Arten von Briefmarken gab: Englische Briefmarken, in Sets, am Anfang des Albums; und ausländische Briefmarken, die alle durcheinandergebracht wurden, am Ende des Albums. Diese philatelistische Beobachtung ist bis heute die organisatorische Leitidee hinter ASCII-basierten Systemen. Richtige Buchstaben und Zeichen werden durch die Codes 32 für Raum bis 126 für Tilde dargestellt; Fremdkörper mit den dazugehörigen Haken und Schlaufen und verirrten Teilen von Fliegenschmutz erscheinen irgendwo oben.)

Unicode dann

Soweit ich weiß, gibt es keinen Schöpfungsmythos, der mit der Vereinigung der Zeichensätze der Welt verbunden ist.

Ich stelle mir gerne einen Herrn Unicode vor, der im Gebäude der Vereinten Nationen mitwirkte und mit der Erstellung der neuen Anweisungskarte für die Feuerübung beauftragt war, die die gleichen drei oder vier Sätze in 117 Sprachen enthielt. Als er versuchte, es auszudrucken, schrieb die Epsom Salts NoisyMatrix 800000 ein einziges Smiley-Face oben auf der Seite, schaltete ihre Out Of Paper-LED ein und stürzte ab.

In dieser Nacht setzte sich Herr Unicode mit Frau U und ihren beiden kleinen Glyphen (die dafür bis nach ihrer Schlafenszeit aufbleiben durften) an seinen Küchentisch und zählte alle Zeichen in allen Sprachen der Welt. Und als sie fertig waren, sie zu addieren, stellte sich heraus, dass es nur noch 60.000 von ihnen waren, mehr oder weniger.

Auch wenn diese Darstellung der ersten Bewertung nicht ganz richtig ist, hat der Realisierer Herr U die Entdeckung gemacht, dass die Gesamtzahl in zwei Bytes untergebracht werden könnte. Er behauptete, dass “die Idee, die Basis für die Zeichencodierung von 8 auf 16 Bit zu erweitern, so sinnvoll, ja so offensichtlich ist, dass der Verstand zunächst davon zurückschreckt”[siehe Unicode 88 Abschnitt 2.1, PDF].

Herr Unicode hat zugegeben, dass es tatsächlich ein paar mehr als 65.536, die 216er Grenze, gab, aber nur, wenn man “unangemessene Zeichen” einbezog. So sieht es aus.

Diese Idee war ein Hit. In den frühen 90er Jahren wurde Unicode als Heilmittel für Zeichensatzprobleme gefeiert und in die Technologien der damaligen Zeit integriert.

Neugeborenes Windows NT hatte es, und so auch nicht ganz alles erobernde C++ erweiternde GUI-Framework Qt. Modische, futuristische Java zeigte es, mit frühen Lehrbüchern, die Dinge wie die folgenden definieren

öffentliches statisches Finale Doppel π = 3.14159;

nur weil sie es konnten.

Wir Techies dieser Zeit waren sehr beeindruckt. Niemand kümmerte sich darum, dass die Hälfte der Bytes in einem String Null waren. All diese zusätzlichen Löcher machten es einfacher, kühle In-Memory-Datenbanken zu lüften.

Außerdem schienen ein paar zusätzliche Bytes und einige abscheuliche Konstrukte wie Visual C++’s TCHAR, wie ein fairer Preis, den man im Austausch für die glorreiche Vereinfachung zahlen musste, dass alle Zeichen die gleiche Länge hatten. Die Zukunft schien voller fröhlicher, wohlgenährter Menschen aller Glaubensrichtungen, Farben und vor allem Zungen, die sich gerne die Laptops der anderen teilen und auf Dinge zeigen und lachen, wie auf Microsoft-Marketing-Fotos zu sehen ist.

Jetzt Unicode

Es stellte sich heraus, dass es doch Verwendungen für unangemessene Charaktere gab. Wikipedia sagt, dass viele der weggelassenen chinesischen Zeichen Teil von Personen- und Ortsnamen waren. Man kann sich das Gefühl vorstellen, dass eine Person mit einem Namen, der das chinesische Äquivalent von “Higginbottom” war, entdeckt, dass ihr Name mit dem ursprünglichen Unicode-Zeichensatz in das chinesische Äquivalent von “Figgingarse” umgewandelt werden muss.

Die Figgingars dieser Welt – auch bekannt als “die Regierung der Volksrepublik China” – waren verständlicherweise nicht besonders zufrieden. Im Jahr 1996 räumte das Unicode High Command das Problem ein und veröffentlichte eine überarbeitete Norm, um unzumutbare Ausreißer zu berücksichtigen. Sie umfasst derzeit rund 110.000 Zeichen.

Sie werden bemerkt haben, dass dies deutlich über der ursprünglichen Zwei-Byte-Grenze liegt. Und, ja, es erzwang die schreckliche Rückkehr von Zeichen variabler Länge.

Das ist ein wichtiger Punkt. Der Standard, dessen Hauptvorteil darin bestand, dass alle Zeichen in der gleichen Länge kodiert wurden, verlor 1996 diesen Vorteil.

Er überlebte nicht einmal lange genug, um die Kuppel zu sehen.

In Joel Spolskys berühmtem Essay von vor zehn Jahren bevormundet er Programmierer, die glauben, dass “Unicode einfach ein 16-Bit-Code ist, bei dem jedes Zeichen 16 Bit hat….. Es ist der häufigste Mythos über Unicode, also wenn Sie das gedacht haben, fühlen Sie sich nicht schlecht”.

Mythos? Mythos? Oh, verpiss dich, Joel.

Ich meine, es ist ja nicht so, dass der erbärmliche Zustand des originalen Unicode weit verbreitet wurde, oder? Wenn es “Unicode, das mächtige Schwert von Babel, das gebrochen war und hastig wieder verklebt wurde” genannt würde, dann würden wir wissen, wo wir sind.

Terminologische Unterbrechung

Übrigens, Joel verwendet den Namen’UCS-2′ anstelle von’Unicode’. Das ist wahrscheinlich korrekter, aber ich weigere mich, ihm zu folgen:

Es verwechselt das Thema mit zusätzlichem Fachjargon – ich schreibe hier eine Schimpfwörter, nicht ein blutiges technisches Handbuch.

Ganz Microsoft stört sich nicht, also sehe ich nicht, warum ich das tun sollte.

Es hat etwas von der Konnotation, eine unbeliebte “Kopfsteuer” mit der vernünftig und offiziell klingenden “Gemeinschaftsanklage” zu würdigen, und

Ich glaube, es sollte sowieso “UTF-16” sein, wenn wir wirklich diesen genauen Terminologieweg gehen würden.

Während wir hier sind, ist zu beachten, dass ich mich trotz Ihrer Einwände auch weigere, die folgenden Begriffe einzuführen/zu definieren: UTF-1′,’UTF-7′,’Grapheme Cluster’,’Codepunkt’,’UCS-4′ und’ISO 10646′. Sobald man auf diesem Weg beginnt, verstrickt man sich hoffnungslos in mühsame Erklärungen, die verhindern, dass man den Punkt erreicht. So steht beispielsweise das führende’U’ in all diesen Abkürzungen für’Unicode’, was an sich schon etwa drei Paras einer langweiligen, daumenverbreiternden Erklärung erfordert.

Aber ich habe kein Problem damit, dass du sie alle durchsuchst oder in den Kommentaren darüber streitest, wenn du willst. In deiner Freizeit.

Die Alternative

Anfang der 2000er Jahre hatte sich eine plausible Alternative etabliert: UTF-8. Dies ist eine byteorientierte Kodierung, die die Kompatibilität mit dem ursprünglichen 7-Bit-ASCII beibehält, aber (wie nach 1996 Unicode) den Fluch von Zeichen variabler Länge erleidet, um mit dem Fremden fertig zu werden. Einzelne Zeichen werden durch ein bis vier Bytes dargestellt.

Die Schnörkel der UTF-8 werden jedoch mit einem eleganten Schema kodiert, das von einem richtig erwachsenen Ken selbst entworfen wurde. Thompsons Schema hat eine “selbstsynchronisierende” Funktion, d.h. Sie können die Zeichengrenzen an jeder Stelle einer Zeichenkette entdecken, ohne zum Anfang zurückkehren zu müssen. Es ist nicht so schön zu verarbeiten wie eine Reihe von einheitlichen Charakteren, aber es fühlt sich an wie das absolute Beste aus einem schlechten Job.

Ich kannte UTF-8 schon seit vielen Jahren und hatte gemerkt, dass es das bevorzugte System in der GNUdal-Tendenz ist. Sicher, Linux benutzte UTF-8, anstatt sich dem Horror von 16-Bit-Zeichen zu unterwerfen; aber ich nahm an, dass dies auf Linux-Anwender zurückzuführen war, die es vorzogen, in C zu programmieren, anstatt in frechem Upstart C++, und die GUIs im Allgemeinen als ein kaum zufriedenstellendes System für das Marshalling ihrer halben Dutzend Terminalsitzungen betrachteten.

 

Das Manifest

Dann hat mich letzte Woche ein Kollege auf diesen Artikel, UTF-8 Everywhere, hingewiesen.

Und ich habe das Licht gesehen.

Ich fordere Sie auf, es selbst zu lesen, aber in der brutalen Zusammenfassung argumentiert es überzeugend, was ich leichtfertig argumentiert habe:

Dieser 16-Bit-Unicode ist hoffnungslos kaputt.

Dass UTF-8 an sich für alles überlegen ist, außer für sehr spezielle Aufgaben.

Dass, wo immer möglich, alle neuen Codes den ersten vermeiden und den zweiten bevorzugen sollten.

Offensichtlich wird dieser letzte Punkt ein wenig knifflig sein.

Für Windows C++-Programmierer identifiziert das Manifest spezifische Techniken, um den eigenen Kerncode UTF-8-basiert zu machen, einschließlich einer speziell für diesen Zweck entwickelten Proto-Boost-Bibliothek. (Ironischerweise ist das erste, was Sie tun müssen, der Unicode-Schalter im Visual C++-Compiler auf ‘on’ zu schalten.)

Für Benutzer anderer Tools ist es eine Einladung, Ihre Position zu überprüfen. Zum Beispiel sollten meine Delphi-Kollegen beachten, dass Embarcadero die Unterstützung für den UTF8String-Typ von seinen neuen LLVM-basierten Compilern eingestellt hat. Brummen.

Wie es im Manifest heißt: “UTF-16 [….] existiert aus historischen Gründen, bringt viel Verwirrung und wird hoffentlich aussterben”.

Amen dazu. Nächstes Wochenende werde ich alle meine Unicode-Dateien von meiner Festplatte kratzen, sie auf den Boden des Gartens bringen und verbrennen. Als gute Bürger der digitalen Welt fordere ich Sie alle auf, dasselbe zu tun.

Und wenn Sie anderer Meinung sind, können Sie Uńίϛ٥⾞✯ deaktivieren. ®