Christian Seiler: PHP Mal wieder UTF-8: Suchbegriff mit Umlauten nicht gefunden

Beitrag lesen

Hallo,

Das mag stimmen. Aber das nächste Problem sehe ich danach wieder auf uns zukommen. Wenn dann eines Tages alles "automatisch" funktioniert, also die Editoren und die Interpreter und die Datenbanken sich  alle in UTF-8 unterhalten, dann möchte ich mal sehen, wie man dann den IT-Nachwuchskräften noch erklärt, was da eigentlich unter drunter so passiert. Denn dass es dann keine Fehler mehr gibt, glaube ich nicht.

Das Problem ist ja vielmehr noch ein anderes: Die Leute unterschätzen einfach, wie kompliziert tatsächlich Internationalisierung ist. In der Regel kennt man nämlich nur seinen eigenen Kulturkreis - und den nichtmal unbedingt so gut, wie man denkt.

Zum Beispiel gehen hier in Deutschland fast alle Leute davon aus, dass man von Links nach Rechts schreibt. Viele haben vielleicht schonmal davon gehört, dass man in anderen Kulturkreisen (Israel oder Saudi-Arabien z.B.) auch von Rechts nach Links schreibt. Aber sie haben sich vermutlich noch nie darüber Gedanken gemacht, was das nun für Ein- und Ausgabe am Computer heißt. Ich hab ja mal vor einiger Zeit den Unicode-Bidi-Algorithmus etwas zerpflückt. Der ist höllisch kompliziert. Nicht, weil die Unicode-Leute alle abgehobene Akademiker im Elfenbeinturm sind - im Gegenteil: Der ist so kompliziert, weil die Anforderungen an Unicode eben so kompliziert sind: Wenn man alle Sprachen der Welt abdecken können will, muss man eben enorm viel berücksichtigen.

Weitere Beispiele: In Ländern mit lateinischer Schrift gibt's ja Groß- und Kleinschreibung. Man unterscheidet damit in der Regel zwischen "upper case", "lower case" und "title case" (jeder erste Buchstabe eines Wortes groß, der Rest klein). Dummerweise treten hier gleich *etliche* Probleme auf:

  1. Die Regeln für die Umwandlung zwischen Groß- und Kleinschreibung sind nicht immer umkehrbar - z.B. wird "ß" zu "SS", "SS" wird aber zu "ss". Was noch viel schlimmer dabei ist: Ein Zeichen wird plötzlich zu zwei Zeichen. [Ja, Unicode hat übrigens inzwischen ein großes "ß", aber die Regeln für die Groß/Kleinumwandlung haben sie nicht geändert.]

  2. Die Regeln für Groß- und Kleinschreibung sind Sprachabhängig. Im Türkischen gibt's z.B. den Buchstaben "i" sowohl in Groß- als auch in Kleinschreibung mit und ohne Punkt (d.h. 4 Varianten) - d.h. im Türkischen ist die Großschreibung von "i" eben "İ" und nicht "I" - und die Kleinschreibung von "I" eben "ı" und nicht "i". Deswegen sind "ISA" und "isa" bei türkischer Spracheinstellung nicht mehr identisch unter einem Vergleich, der "case insensitive" ist. [1].

  3. Andere Sprachen kennen keine Groß- und Kleinschreibung - Japanisch fällt z.B. unter die Kategorie (wie auch Koreanisch, etc.).

Weiteres Beispiel: Normalisierung: Um den gesamten Wust an Zeichen, die man so braucht, irgendwie abdecken zu können, gibt's in Unicode die Möglichkeit, Zeichen zusammenzusetzen. D.h. statt "ä" kann man auch schreiben "Umlaut-Modifier", "a". Weil's aber eben auch "ä" gibt (das hat praktische Gründe), muss man beim String-Vergleich höllisch aufpassen.

Noch ein Beispiel: Unihan. Kennt man hierzulande gar nicht. Die Idee ist, dass die Schriftzeichen in China, Japan und Korea zu einem großen Teil sich ähneln. Daher haben sich die Unicode-Leute (damit sie nicht 3x so viele Zeichen hinzufügen müssen wie sie sowieso schon hinzufügen mussten) etwas ausgedacht, was Han Unification (Unihan) genannt wird - d.h. diese drei Schriftsprachen (chinesisch, japanisch und koreanisch) teilen sich die meisten Zeichen. Das Problem: Auch wenn die Zeichen ähnlich aussehen, sehen sie halt doch nicht ganz identisch aus. Deswegen enthält der Unicode-Standard auch etwas, was sich "CJK Disambiguition" nennt - d.h. je nachdem, in welcher Sprache der Text gefasst ist (das verarbeitende Programm muss sich diese Informationen extra besorgen bei HTML z.B. über lang="jp" o.ä.) sollten die Zeichen unterschiedlich dargestellt werden.

Und das waren jetzt mal die prominentesten Beispiele - sie zeigen aber, wie komplex Internationalisierung wirklich ist. Und das liegt nicht am Unicode-Standard, sondern an der Vielfalt an Kulturen, die wir hier auf der Erde haben. Die unter einen Hut zu bringen ist alles andere als einfach.

Und genau *DAS* ist das eigentliche Problem mit UTF-8. *Nicht* das Kodierungsverfahren, das ist eine simple mathematische Vorschrift, welche Bits in welchen Bytes wie gesetzt werden müssen. *Nicht* der Unicode-Standard als solcher - der ist sehr sorgfältig und gewissenhaft designed worden. Nein, das Problem ist einfach, dass die meisten Leute, die Programme schreiben, die Komplexität von Internationalisierung nicht wirklich erfassen. Vielleicht auch gar nicht erfassen können - man kann ja schließlich auch nicht alles wissen. Und deswegen ist es in meinen Augen essentiell, dass die Programmiersprachen das möglichst transparent gegenüber dem Programmierer zu machen - damit der eben nicht mehr zu sehr über so etwas nachdenken muss. Aber bis es in der Hinsicht *wirklich* einfache Lösungen gibt, wird es noch sehr lange dauern. Vor allem, weil es noch viel zu viele Legacy-Systeme gibt - und immer, wenn man die Unicode-Kette irgendwo potentiell unterbrechen muss, wird es dann gleich nochmal deutlich komplizierter.

Viele Grüße,
Christian