UniCode ist ein universeller Zeichensatz, der Zeichen aus allen Sprachen dieser Welt enthält (bzw. enthalten kann).
Begriffe:
UCS-2 ist die 2Byte/16Bit-Repräsentation von Unicode-Zeichen. Damit sind die wichtigsten Zeichen adressierbar.
UCS-4 ist die 4Byte/32Bit-Repräsentation von Unicode-Zeichen. Damit sind alle Unicode-Zeichen adressierbar.
UTF-8 ist eine Enkodierung, die Unicode-Zeichen auf ein oder mehrere Einzelbyte(s) abbildet. Besondere Eigenschaften macht sie besonders kompatibel:
- ASCII-Zeichen 0..127 sind in UTF-8 identisch
bei Zeichen >127 werden Mehrbyte-Sequenzen gebildet, die aber keine Nullbytes enthalten (was bei C-ähnlichen Sprachen und den damit erstellten Programmen problematisch wäre, weil es dort das Ende der Zeichenkette bedeutet).
UTF-7 ist ähnlich wie UTF-8, aber die kodierte Zeichenkette enthält nur reine 7Bit ASCII Zeichen. Diese Kodierung wird selten gebraucht.
UTF-16 ist eine Kodierung, bei der die meisten Zeichen wie bei UCS-2 mit 2Byte (16Bit) dargestellt werden. Wo das aber nicht ausreicht, können Zeichen auch mal mit 4Byte (32Bit) mittels sogenannter Ersatzzeichen (engl: surrogate characters) dargestellt werden.
Mini-HowTo
Font für X11
Wenn man keinen Unicode-Font installiert hat, zeigt z.B. Mozilla bei unbekannten Zeichen nur Kästchen mit jeweils 4 Hexzahlen an.
Abhilfe:
# Debian enthält den Font ttf-freefont, der viele Tausend Unicode-Zeichen enthält apt-get install ttf-freefont
Des weiteren muss noch locale umgestellt werden: LANG=de_DE.UTF-8
Mozilla
Preferences > Appearance > Fonts, Fonts for Unicode:
Serif: FreeSerif
Sans-serif: FreeSans
Monospace: FreeMono
Test
http://www.alanwood.net/unicode/unicode_samples.html - bei z.B. cyrillic und greek sollten dann entspr. Schriftzeichen erscheinen. Eine weitere gute Seite mit Beispielen ist http://www.columbia.edu/kermit/utf8.html
Mit ttf-freefont erscheinen dort die wichtigsten Zeichen der wichtigsten Sprachen - aber obwohl dieser Font einige tausend Zeichen enthält, bleiben auf der Testseite doch noch einige "Hex-Kästchen".
Fragen und Antworten
Frage: Wie ist denn der Stand beim Unicode-Support? Inwieweit gibts Unterstützung vom Betriebssystem, welche Anwendungen funktionieren damit? (Euro-Symbol, gleichzeitige Verwendung von osteuropäischen, türkischen und spanischen Zeichen in einem Text, etc.)
Distributionen:
RedHat ist seit Version 8 standardmäßig auf utf-8 eingestellt.
SuSE ist seit Version 9.1 ebenfalls standardmäßig auf utf-8 eingestellt.
Anwendungen: Standardmäßig werden alle neueren GNOME- / GTK-Programme wie z.B. GRip oder easytag für das Dateisystem utf-8, was zu Problemen führt, wenn der Rest des Systems noch ISO-8859-15 nutzt: es werden keine Umlaute und andere Sonderzeichen angezeigt. Daher kann man den Parameter G_FILENAME_ENCODING=@locale setzen (entweder systemweit in /etc/enviroment oder per User in ~/.xsession).
Mozilla 1.3 und 1.5a funktioniert (andere Versionen nicht getestet)
Konqueror natürlich auch
von xterm gibt es eine Unicode-fähige Variante "uxterm"
auf der Textmodus-Konsole wird es schwieriger, siehe ConsoleFonts
wily, eine Portierung des sehr seltsamen Editors von Plan9, benutzt ebenfalls Unicode
- gucharmap und kcharselect sind zwei Programme, mit denen man sich alle Zeichen hübsch ansehen und in die Ablage kopieren kann.
KDE - alle KDE-Programme unterstützen utf-8, GNOME (AFIAK) ebenfalls
LaTeX - \usepackage[utf8]{inputenc}
Editoren
yudit ist ein Unicode-Editor
- kate, kwrite, kdevelopp, quanta-plus, kile, etc. ... : alle Editoren aus dem KDE-Projekt
Programmiersprachen:
Python unterstützt UCS-2 oder UCS-4 (je nach Compile-Time-Einstellung per configure) und div. Encodings wie UTF-16, UTF-8, ISO 8859-x, usw., die sich beliebig erweitern lassen (siehe u.a. SourceForge für Codec-Projekte).
Perl unterstützt UTF-8, näheres hierzu siehe http://www.heise.de/ix/artikel/2000/05/178/
Java hat ebenfalls Unicode-Unterstützung
C hat prinzipiell auch Unicode-Support, jedoch nicht wirklich einfach (mit wchar).
Betriebssystem:
Dateinamen: UTF-8 ist bei Zeichen 0..127 identisch mit ASCII und bei Zeichen-Kodierungen mit mehr als 1 Byte werden keine Nullbytes verwendet. Daher sollte GNU/Linux damit i.d.R. funktionieren.
Problematisch ist es immer, wenn eine Anwendung einen anderen Zeichensatz erwartet als man ihr vorsetzt, insbesondere bei UTF-8 <> Single-Byte-Zeichensatz (z.B. Latin-1)
- Dadurch kann z.B. mit manchen Programmen auf bestimmte Dateinamen nicht zugegriffen werden.
Bei der Verwendung eines Dateisystems in verschiedenen Betriebssystemen ist Vorsicht geboten, am Besten immer den gleichen Zeichensatz verwenden!
Generell:
- verwendet eine Anwendung UTF-8 und produziert damit Daten, dann sollte der Empfänger der Daten idealerweise auch UTF-8 verstehen, sonst werden z.B. Umlaute als seltsame 2-Zeichen-Kombinationen dargestellt - dies kann mit nicht-UTF-8-fähigen IRC- oder E-Mail-Programmen öfters beobachtet werden. Der Text ist allerdings i.d.R. trotzdem noch verständlich und damit auch nicht tragischer als die seither auftretenden Probleme mit verschiedenen Zeichensätzen.
- exotische Dinge wie Bidirektionalität (auch "von rechts nach links schreiben"), die Eingabe exotischer, komplexer Zeichen u.ä. kann von den meisten Anwendungen derzeit nicht erwartet werden
Tools:
- iconv wird seit der glibc 2.1 mitgeliefert, das zwischen den verschiedenen Zeichensätzen konvertieren kann.
- Das Paket GNU recode unterstützt seit Version 3.5 ebenfalls Unicode.
convmv kann automatisch Dateinamen zwischen Zeichensätzen konvertieren.
Migration von Dateien
Zuerstmal sollte man alle Dateinamen migrieren, das geht am Besten mit convmv:
convmv -f iso-8859-15 -t utf-8 -r .
Beim mount kann ebenfalls mitgeteilt werden, wie die Dateinamen kodiert sind (z.b.: mount -t vfat -o utf8 ... ).
Die Konvertierung von Dateiinhalten ist schwieriger, prinzipiell kann und sollte man nur Dateien konvertieren, die ausschließlich Text beinhalten und keine Binärdaten.
- Office-Dokumente: sind meist binär, kann man bestenfalls innerhalb der Anwendung konvertieren
- HTML-, XML-, PHP-Dateien: kann man wie reine Textdateien konvertieren, man muss aber zusätzlich die Header ändern
- reine Textdateien: Konvertierung mit iconv
find . -type f -name '*.txt' -exec iconv -f iso-8859-15 -t utf-8 -o {}.tmp {} \; -exec mv {}.tmp {} \;