Skip to content

Java und Unicode

Der native Java Typ char ist vorzeichenloser, ganzzahliger mit einer Breite von 16 bit. Mit dem Wertebereich 0-65535 deckte der Datentyp ursprünglich alle definierten Zeichenwerte des Unicode Standards ab. Dieser Umfang (die sogenannte Basic Multilingual Plane, BMP) umfasst einen Großteil der Zeichen aller aktuell im Gebrauch befindlichen Schriften. Nach Unicode Konvention werden die Zeichenwerte mit U+0000 - U+FFFF (also in Hex Schreibweise mit vorangestelltem 'U+') notiert. Oberflächlich hat sich damit sicherlich schon jeder Java Entwickler beschäftigt. Ist ja auch eine Grundvoraussetzung zum Verständnis der Unterschiede zwischen einem Zeichen-Reader und einem Byte-Stream. Wie die meisten Entwickler habe ich mich mit den Details erst befasst, als es Notwendig wurde eine Richtlinie für die Übersetzung unserer J2EE Anwendungen für den asiatischen Markt zu erstellen. Unicode fasst einen Großteil der Schriftzeichen aus Fern-Ost in CJK Unified Ideographs (Unihan) zusammen. Unicode 4.x definiert aber weitaus mehr Zeichen. Im Moment ist der Bereich bis U+10FFFF für weitere Zeichen vorgesehen. Darunter ein großer Block der zusätzlichen CJK Zeichen. Darin enthalten sind weniger gebräuchliche Schriftzeichen zur Darstellung von Eigennamen und Zeichen die speziell für die Kompatibilität mit nationalen Zeichensätzen reserviert wurden. Erstere werden z.B. für Software in der öffentlichen Verwaltung benötigt. Oder auch nur, wenn es darum geht Dateien von bestehenden Anwendungen verlustfrei zu verarbeiten. Hier stellt sich jetzt sofort die Frage: "Wie stelle ich mit einem 16bit Java Datentyp die Zeichenwerte mit einer Breite von 20bits dar?" Die Antwort ist erschütternd einfach: gar nicht. Dieses Problem ist natürlich auch Sun bekannt. Java bietet eine Lösung - oder besser: Workaround - an. Die "Supplementary Characters" die in Java 1.5 eingeführt wurden. Es wurde dazu aber nicht der char Datentyp neu definiert (der bleibt weiterhin bei 16bit), sondern es wurden neue Funktionen und Methoden für den Zugriff auf Zeichenwerte geschaffen, die mit int Werten (signed 32bit) arbeiten. "Java und Unicode" vollständig lesen