Dr. Alexander Behrens (IALT) – Unterrichtsserver


04-005-1003-R.VL01 Vorlesung "Translatologie B-Sprache" 2. Semester

Kodierung

Einheiten

8 Bit=1 Byte
2 Byte=1 Wort

ASCII

Im American Standard Code for Information Interchange (ASCII) hat jedes Zeichen acht Bits, also ein Byte. Eines dieser acht Bits ist für andere Zwecke reserviert; für die Kodierung eines Zeichens verbleiben also sieben Nutzbits). Mit Adam Rieses Beistand kommen wir schnell auf die Anzahl der einem solchen "trunkierten" Byte innewohnenden Kombinationsmöglichkeiten: 27 = 128 Zeichen. Ein ASCII-Zeichensatz – wir sagen Zeichentabelle (code page) – bietet Raum für 128 Zeichen. Einhundertachtundzwanzig Zeichen reichen für die Sprachen der Welt natürlich vorne und hinten nicht. Man hat deswegen für unterschiedliche Alphabete (Skripte) unterschiedliche Zeichentabellen bereitstellen müssen; je nach eingestellter Zeichentabelle konnte ein bestimmter Zeichencode für das eine oder eben für das andere Zeichen stehen. Anwender älterer Generationen können sich vielleicht noch erinnern: Öffnete man in früheren Betriebssystemen eine Textverarbeitungsdatei, so durfte man u. U. zunächst verschiedene Schriftarten durchprobieren, eh man "Sonderzeichen" ordentlich angezeigt bekam, Zeichen, die nicht zum englischen Alphabet gehörten.

ANSI

Linderung brachte zunächst eine Initiative des American National Standards Institute (ANSI), namentlich der Vorschlag, das in ASCII noch unbenutzte achte Bit mit für den Zeichencode zu nutzen. Man lag damit bei 28 = 256 Zeichen. Auf dem lateinischen Alphabet basierende "Sonderzeichen" waren nun Teil der Latin-Familie. Die Welt setzt dem Institut ein Denkmal, indem Sie von der ANSI-Kodierung spricht, obwohl diese eigentlich nichts weiter ist als eine ASCII-Form.

Die Skripte der Welt hätten das nun bestehende Aufnahmevermögen von 256 Zeichen aber immer noch gesprengt. Jeder Skriptwechsel (etwa beim Umschalten der Oberflächensprache in einem Programm) erforderte nach wie vor einen Tabellenwechsel; aufwändig war es in ANSI auch, innerhalb eines Textes gemischte Skripte zu ermöglichen, also etwa Kyrilliza und Latiniza. Diese Hürde galt es zu überwinden. Es musste doch möglich sein, alle Skripte der Welt in einem Zeichenvorrat zu vereinen!

UCS-2 / UTF-16

Im Jahre 1991 war es tatsächlich soweit: Die Welt hatte ihre erste universelle Kodierung, das Unicode Transformation Format (UTF). Wie machte man das? Die Lösung bestand darin, die alte Regel "1 Zeichen = 1 Byte" aufzuweichen. Die meisten Anwendungen verwenden heute UTF-16, also aus einem oder zwei Worten bestehende Zeichen.

Zweifellos war es eine Errungenschaft, dass nun alle Zeichen innerhalb eines Zeichensatzes dargestellt werden konnten. Musste man deswegen aber gleich so mit Speicherplatz aasen? Immerhin verbrauchte UTF-16 mit 16 oder 32 Bits pro Zeichen doppelt oder viermal so viel wie ein ANSI-Zeichen, allzumal die meisten Zeichen, die wir verwenden, ohnehin im ANSI-Zeichensatz enthalten sind, sich mit einem Byte darstellen lassen. UTF-16 benutzt bei diesen Zeichen nur ein Byte (das niedrigstwertige); das andere (höchstwertige) Byte wird mit Nullen gefüllt und mitgeschleppt. Diese Verschwendung ist solange kein Problem, wie die Daten auf der Festplatte herumliegen.

Sobald wir mit ihnen aber arbeiten wollen, müssen sie – das Wort sagt es schon – in den Arbeitsspeicher (auch Hauptspeicher, interner Speicher oder einfach Speicher) geladen werden: es muss ein Datenstrom stattfinden. Für diesen Datenstrom musste man sich eine sparsamere Lösung ausdenken. UTF-8 beansprucht, wie wir an der Zahl 8 im Namen erkennen sollen, ein zweites Byte nur dann, wenn es dieses Byte auch braucht.

Schwachstelle "Arbeitsspeicher"

Wir wissen nun, dass Unicode dank der Einführung von Mehrbytezeichen alle Skripte der Welt in einem Zeichensatz bedienen kann. Mit der Einführung von Mehrbytezeichen hatte man aber nicht nur ein Problem gelöst, sondern auch eines geschaffen, denn Arbeitsspeicher sind für das Ablegen von Mehrbytezeichen eigentlich nicht geeignet.

Der Arbeitsspeicher eines Computers besteht aus durchnummerierten Speicherzellen, von denen jede genau ein Byte beherbergen kann. Ein ANSI-Zei­chen passte mit seinen acht Bits also genau in eine solche Speicherzelle. Ist ein Zeichen nun plötzlich länger als 1 Byte, so muss es auf mehrere benachbarte durchnummerierte Speicherzellen verteilt werden. Auch das wäre noch kein großes Problem, würden wenigstens die fleißigen Vollstrecker in diesem Prozess, die Prozessoren, alle gleich vorgehen. Aber das tun sie nicht.

Schwachstelle "Prozessor"

Kehren wir noch einmal zu unserem Datenstrom zurück, der entsteht, wenn zwischen der Festplatte und dem Arbeitsspeicher Daten ausgetauscht werden müssen. Problematisch ist ein solcher Datenaustausch, wenn er wortweise1 stattfindet, wie wir es bei UTF-16 haben. Die Reihenfolge, in welcher der Prozessor die Bytes eines Worts hierbei "anfasst" (die Prozessorarithmetik, Endianness), variiert von Prozessor zu Prozessor. Manche Prozessoren schreiben das höchstwertige Byte2 eines Worts zuerst (in die erste freie Speicherzelle, jene mit der niedrigsten Nummer), andere (besonders jüngere Prozessoren wie Intel) beginnen mit dem niedrigstwertigen Byte3. Es existieren auch gemischte Szenarien4.

Die komplizierte Formulierung mit höchstwertig zuerst bzw. niedrigstwertig zuerst ist leider unumgänglich, denn griffigere Bilder wie vorwärts und rückwärts mögen intuitiv sein, funktionieren aber nicht so recht. Im Arabischen wird von rechts nach links gelesen (wie wir es bei arabischen Zahlen teilweise ja auch tun), und doch würde niemand sagen, man würde dort rückwärts lesen. Bleiben wir also besser bei höchstwertig zuerst und niedrigstwertig zuerst: Bei der Zahl 1489 belegt 1 die höchstwertige Position (nämlich den Tausender) und 9 die niedrigstwertige Position (nämlich den Einer). Beim Schreiben dieser Zahl ist der deutsche Sprachanwender ein big endian, beim Lesen ist er ein mixed endian.

Nun ist der Prozessor zwar schnell, gehört aber sonst zu den eher schlichten Gemütern – er nimmt die Dinge, wie sie kommen. Die Worte müssen ihm deswegen bereits richtigherum gereicht werden, sonst macht er damit Unfug.

KrümelmonsterWenn Sie in der Sesamstraße aufgepasst haben, sind Sie mit dem Arbeitsprinzip eines Prozessors bereits vertraut.

Den passenden Rückschluss aus dem Gesagten haben Sie wahrscheinlich schon gezogen: Die in einer Datei vorliegende Notation muss der Nachwelt irgendwie mitgeteilt werden. Nur so kann ein verarbeitendes Programm wissen, ob es die Worte bei der Vorbereitung des Datenstroms "drehen" muss, und sicherstellen, dass der Prozessor mit ihnen richtig rechnet. Die Rechenoperation 54 + 37 führt nur dann zu demselben Ergebnis wie die Operation 45 + 73, wenn die erste Operation von einem big endian durchgeführt wird und die zweite von einem little endian.

Die oben erwähnte Mitteilung übernimmt für uns ein Ausdruck am Dateianfang (deswegen auch Präambel genannt), der keine literale Bedeutung hat (nicht dargestellt, nur ausgewertet wird, zumindest, wenn alles gut geht) und deswegen zero width no-break space heißt oder hieß, kurz ZWNBSP. Mittlerweile spricht man eingängiger vom Byte Order Mark, kurz BOM / bɒm /. Nicht erspart bleibt Ihnen aber der Ärger mit Dateien, in denen ein BOM fehlt, aber besser hätte stehen sollen.

Das Byte-Order-Mark (BOM)

Das Byte-Order-Mark unterrichtet ein Programm über eine vorliegende (die beim Schreiben in die Datei oder in den Arbeitsspeicher verwendete) Byte-Reihenfolge (Notation) im Wort.

Das BOM, unsere Präambel, ist nur für die Interpretation von Wortfolgen (wie im Quellstrom bei UTF-16 vorliegend) erforderlich, nicht jedoch für die Interpretation von Bytefolgen (wie im Quellstrom bei UTF-8 vorliegend). Wir benötigen das Byte-Order-Mark also nur bei UTF-16.

Letzter Satz klingt gut, gilt allerdings nur für das BOM in seiner primären Funktion, denn die Probleme hören hier leider nicht auf: Woher soll ein verarbeitendes Programm wissen, ob eine bestimmte 16-Bit-Sequenz eines präambellosen Dokuments für zwei Einbytezeichen steht oder für ein Zweibytezeichen, also verkettet5 oder addiert6 werden soll, sprich, ob ANSI oder UTF-8 vorliegt? Für UTF-8 gilt deswegen ferner:

Mit dem Byte-Order-Mark kann man ausschließen, dass UTF-8-kodierter Text versehentlich als ANSI interpretiert wird.

Illustriert sei dies an dem folgenden konstruierten Satz: Die Wörter слово und стол verlangen dem Lerner äußerst viel Übung ab. Dieser Satz enthält die deutschen Sonderzeichen und kyrillische Buchstaben und würde auch ohne BOM in einem einigermaßen gescheiten Texteditor etwa so aussehen:

GILT-Modell nach Cadieux / EsselinkUnser Testsatz in einer csv-Datei UTF-8 ohne BOM, Ausgabe im Editor Notepad++.

Die Zeichen wurden von dem Editor dank dessen eigener Heuristik (s. u.) als UTF-8-codiert erkannt und richtig dargestellt. Schauen wir uns nun den Satz im Editor von SDL Studio 2014 an:

Testsatz UTF-8 ohne BOMUnser Testsatz in Studio. Die Zweibytezeichen werden hier nicht als solche erkannt. Im Wort Wörter werden beispielsweise statt des Zweitbytezeichens ö die zwei Einbytezeichen à und ausgegeben.

Wir setzen das BOM und laden die Datei in Studio nach:

Testsatz UTF-8 mit BOMDer Testsatz mit BOM. Die Zweibytezeichen werden nun auch als solche erkannt.

Nicht, dass es ohne BOM gar nicht ginge in UTF-8. Wie wir oben gesehen haben, kommt Notepad++ mit der Datei auch ohne BOM blendend zurecht. Manche Programme verfügen über eine Heuristik, die den Dateiinhalt nach UTF-8-verdächtigen Byte-Kombinationen durchsucht, und erkennen UTF-8 von selbst. Aber nicht immer ist eine solche Heuristik sinnvoll, etwa da, wo Geschwindigkeit eine Rolle spielt. Denn das Programm muss hierfür den Quellstrom erst einmal durchforsten, was die Hardware in Beschlag nimmt und Zeit kostet. Wenn ein Byte-Order-Mark gesetzt ist, fällt dieser Arbeitsschritt weg; entsprechend zügiger kann der Datenstrom bereitgestellt werden. Für UTF-8 gilt deswegen schließlich:

Mit dem Byte-Order-Mark können die Daten effizienter / schneller verarbeitet werden.

Dass das BOM auch stören kann, behindert uns Übersetzer weniger.

  • Selten passiert mittlerweile, dass das BOM nicht erkannt und stattdessen als die Latin-1-Zeichen  dargestellt wird.
  • Entwickler wundern sich zuweilen, warum vor einem Include plötzlich so viel Platz ist. Auch eine Leerzeile kann ein falsch interpretiertes BOM sein.


1UTF-8 wird byteweise interpretiert, beginnend im Startbyte mit den höherwertigen Bits. Die Bytereihenfolge ist bei UTF-8 damit geklärt.
2Sogenannter big endian: in dieser Notation schreiben wir auch unsere Zahlen: 54.
3Sogenannter little endian: in dieser Notation sprechen wir Zahlen unter 100 aus: vier→und→fünfzig.
4Sogenannter mixed endian: in dieser Notation sprechen wir Zahlen über 100 aus: einhundert→vier→und→fünfzig.
5Etwa nach dem Prinzip 9 + 3 = 93
6Etwa nach dem Prinzip 9 + 3 = 12

Kontakt, Impressum, Datenschutzerklärung

Für Studierende, die am Literaturübersetzen interessiert sind: der VdÜ bietet eine studentische Mitgliedschaft an, dort "Kandidatur" genannt.
An Studierende mit einer anderen Muttersprache als Deutsch: Das AcademicLab bietet eine Veranstaltungsreihe "UniSpracheDeutsch" mit Workshops, Seminaren, individueller Beratung und Informationen zu Themen rund um Deutsch als fremde Wissenschaftssprache an
An die Studierenden des 3. Studienjahrs B. A. mit nichtrussischer Muttersprache: Zwischen der Universität Leipzig und der Staatlichen Universität Pjatigorsk besteht eine Rahmenvereinbarung, die Ihnen die Absolvierung eines maßgeschneiderten Auslandsteilstudiums ermöglicht. Genauere Informationen finden Sie auf den Seiten Auslandsteilstudium (ATS) Allgemein und Auslandsteilstudium (ATS) in Pjatigorsk.
An die Studierenden des ersten Semesters: Beachten Sie, dass eine Modulanmeldung zur Teilnahme an der Prüfung verpflichtet! Schreiben Sie sich deswegen nicht wahllos in Module ein bzw. melden Sie sich ggf. von "überflüssigen" Modulen rechtzeitig wieder ab!
An die Studierenden des angehenden dritten Studienjahrs B. A.: Sollten Sie erwägen, das fünfte Semester im Ausland zu verbringen, so wäre es für Sie u. U. vorteilhaft, die Dolmetschveranstaltung von 04-005-1007-R schon im dritten Semester zu besuchen.