RunToolz iconRunToolz
Welcome to RunToolz!
KodierungUnicodeEntwicklertools

Zeichenkodierung erklärt: Von ASCII bis UTF-8

Warum dein Text manchmal zu Fragezeichen und seltsamen Symbolen wird. Ein praktischer Guide zur Zeichenkodierung.

RunToolz Team16. Januar 20264 min read

Du öffnest eine Datei und siehst ü statt ü. Oder eine Datenbank gibt ???? zurück, wo jemandes Name stehen sollte. Oder eine E-Mail kommt mit =?UTF-8?B? in der Betreffzeile.

Willkommen in der wunderbaren Welt der Zeichenkodierungsprobleme.

Die kurze Geschichte

Computer speichern Zahlen, keine Buchstaben. Also musste jemand festlegen, welche Zahl welchen Buchstaben bedeutet. In den 1960ern wies ASCII den Nummern 0-127 englische Buchstaben, Ziffern und grundlegende Symbole zu. Der Buchstabe "A" ist 65. Ein Leerzeichen ist 32. Einfach.

Aber ASCII deckt nur 128 Zeichen ab. Das funktioniert für Englisch. Es funktioniert nicht für deutsche Umlaute, japanische Kanji, arabische Schrift oder die tausenden anderen Zeichen, die Menschen tatsächlich verwenden.

Das Chaos vor Unicode

Verschiedene Regionen erfanden ihre eigenen Kodierungen. Westeuropa bekam ISO-8859-1. Japan bekam Shift-JIS. Russland bekam KOI8-R. China bekam GB2312. Jede funktionierte innerhalb ihres eigenen Ökosystems prima. Sobald man sie mischte, ging alles kaputt.

Eine in einer Kodierung gespeicherte und mit einer anderen geöffnete Datei erzeugt Zeichensalat -- dieses wirre Durcheinander falscher Zeichen, das du wahrscheinlich schon gesehen hast. cafe wird zu café, wenn eine UTF-8-Datei als ISO-8859-1 gelesen wird.

Unicode löste das Zuordnungsproblem

Unicode gab jedem Zeichen eine eindeutige Nummer (genannt "Code Point"). Das lateinische A ist U+0041. Der Schneemann ist U+2603. Jedes Emoji, jede Schrift, jedes mathematische Symbol bekommt seinen eigenen Code Point. Über 150.000 Zeichen und wachsend.

Aber Unicode ist nur die Zuordnung. Es sagt nicht, wie diese Zahlen als Bytes gespeichert werden. Das ist die Aufgabe der Kodierung.

Möchten Sie es selbst ausprobieren?Zeichen und Bytes zählen

UTF-8: Die Kodierung, die gewann

UTF-8 ist die Art, wie der größte Teil des Internets Unicode-Text speichert. Der Schlüsseltrick: Es verwendet eine variable Anzahl von Bytes pro Zeichen.

  • ASCII-Zeichen (englische Buchstaben, Ziffern): je 1 Byte
  • Europäische Akzentzeichen: je 2 Bytes
  • Asiatische Zeichen (CJK): je 3 Bytes
  • Emojis und seltene Symbole: je 4 Bytes

Das bedeutet, englischer Text in UTF-8 ist identisch mit ASCII. Alte Systeme brechen nicht. Aber man kann trotzdem jedes Zeichen der Welt darstellen.

Aktuell verwenden über 98% aller Websites UTF-8. Der Kodierungskrieg ist vorbei, und UTF-8 hat gewonnen.

UTF-8 vs UTF-16 vs UTF-32

UTF-8: Variable Breite (1-4 Bytes). Effizient für englischlastigen Text. Web-Standard.

UTF-16: Variable Breite (2 oder 4 Bytes). Wird intern von JavaScript, Java und Windows verwendet. Jedes Zeichen braucht mindestens 2 Bytes, daher weniger effizient für ASCII-Text.

UTF-32: Feste Breite (4 Bytes pro Zeichen). Einfach aber verschwenderisch. Wird selten für Speicherung oder Übertragung verwendet.

JavaScripts string.length zählt UTF-16-Code-Units, nicht Zeichen. Deshalb gibt "😀".length 2 zurück, nicht 1.

Wenn Kodierung schiefgeht

Eine Datei mit falscher Kodierung lesen. Die Bytes sind in Ordnung, aber sie werden falsch interpretiert. Lösung: Die richtige Kodierung beim Öffnen angeben.

Datenbank-Zeichensatz-Mismatch. Deine App sendet UTF-8, aber die Datenbankspalte ist auf latin1 eingestellt. Zeichen außerhalb von ASCII werden verstümmelt. Lösung: Datenbank auf utf8mb4 setzen (nicht nur utf8 in MySQL, das nur 3-Byte-Zeichen verarbeitet).

Fehlender HTTP-Charset-Header. Wenn der Server Content-Type: text/html; charset=utf-8 nicht sendet, muss der Browser raten. Manchmal rät er falsch.

Möchten Sie es selbst ausprobieren?URL kodieren/dekodieren

Praktische Tipps

Verwende immer UTF-8. Außer du hast einen sehr spezifischen Grund, ist UTF-8 die richtige Wahl für alles.

Deklariere deine Kodierung explizit. In HTML: <meta charset="utf-8">. In HTTP: Content-Type: text/html; charset=utf-8. Lass Systeme nicht raten.

Sei vorsichtig mit String-Längen. In JavaScript wird Zeichenzählung bei Emojis und kombinierenden Zeichen knifflig. Verwende Array.from(str).length oder die Intl.Segmenter-API für genaue Zählungen.

Achte auf BOM. Die Byte Order Mark (U+FEFF) taucht manchmal am Anfang von UTF-8-Dateien auf. Sie ist unsichtbar, kann aber Parser zum Absturz bringen. Manche Editoren fügen sie stillschweigend hinzu.


Zeichenkodierung ist kein aufregendes Thema, aber das Verständnis spart Stunden beim Debugging. Verwende überall UTF-8, deklariere es explizit, und wenn du verstümmelten Text siehst, weißt du genau, wo du suchen musst.