The Mystery Charset

Das Veranstaltersystem WBS Blank bietet viele Möglichkeiten, Daten in Form von Listen und anderen Formaten auszugeben. Oft werden solche Ausgabedaten von technischen Systemen weiterverarbeitet. Alles könnte so schön sein, aber ...
Sehen wir uns mal ein Fragment an, wie es z.B. aus irgendeiner Aufenthaltsliste aus WBS Blank stammen könnte:

    01    HERR  M]LLER, MUSTER    B000815   1 X Einzelzimmer, Penthouse Fr}hst}ck

Was bedeuten die kryptisch anmutenden Zeichen „]“ und „}“, für die Benutzer von Apple-Computern mehrheitlich eine Anleitung zur Eingabe auf der Tastatur benötigen (https://origin-discussions-us.apple.com/thread/3670238, 2017-12-15).
Sucht man in der Dokumentation des Herstellers, finden sich einige Stellen, an denen auf eine besondere Behandlung von Umlauten eingegangen wird. So kommt man irgendwann zu einer Lösung, die eine Zeichenersetzung für alle im Deutschen geläufigen Sonderzeichen beinhaltet.
Aber es gibt auch andere Hinweise, etwa „Der Zeichensatz auf dem Unix-Host ist im allgemeinen ISO-21-German“. Googelt man das (Mitte 2017), kommt ein Hinweis auf einen PCL Zeichensatz (eine alte HP Druckersprache), aber keine ISO-Norm. Geben wir nun auf? Niemals, für uns als Java-Company ist eine elegantere Lösung Pflicht. Diese lautet in Java, dass beim Lesen von Streams optional der Zeichensatz geladen werden kann, in dem der Input-Stream kodiert ist. Hier ist ein Beispiel, wie ein Reader zum Einlesen einer Datei konstruiert werden kann.

BufferedReader reader = new BufferedReader(
     new InputStreamReader(
		new FileInputStream(inputFile, MYSTERY_CHARSET)
     );

Nun müssen wir nur noch den wirklichen Namen des mysteriösen Zeichensatzes (in Java Charset genannt) herausfinden. In den standardmäßig bereitgestellten Zeichensätzen ist kein Hinweis auf ISO-21-German zu finden. Aber zum Glück kann man in Java weitere Zeichensätze nebst Zubehör nachrüsten. Ein Fundus ist dabei die frei verfügbare Bibliothek jcharset von freeutils.net. In der Readme.txt findet sich ein erster Hinweis:

    ISO/IEC 646 National Variants: 
	"ISO646-CA" ("ISO-IR-121") 
        "ISO646-CA2" ("ISO-IR-122") 
        "ISO646-CH" 
        "ISO646-CN" ("ISO-IR-57") 
        "ISO646-CU" ("ISO-IR-151") 
        "ISO646-DE" ("ISO-IR-21", "DIN_66003") 

ISO-IR-21 sieht verdächtig aus, kann es sein, dass DIN 66003 gemeint war? Immerhin finden sich nun auch im Internet sachdienliche Hinweise, z.B. auf Wikipedia. Da zeigt sich, dass die internationale Norm ISO646-DE heißt.
Das probieren wir doch gleich mal aus. Mit Maven kann jcharset wie folgt eingebunden werden.

<dependency>
    <groupId>net.freeutils</groupId>
    <artifactId>jcharset</artifactId>
    <version>2.0</version>
</dependency>

Unser Fragment ändert sich nun wie folgt:

private final String MYSTERY_CHARSET = "ISO646-DE";

BufferedReader reader = new BufferedReader(
    new InputStreamReader(
			new FileInputStream(inputFile, MYSTERY_CHARSET)
    );

Und wenn man dann die Datei zeilenweise liest und in UTF8 wegschreibt, erhält man wunderschön

    01    HERR  MÜLLER, MUSTER    B000815   1 X Einzelzimmer, Penthouse Frühstück

Und das funktioniert auch für alle anderen Sonderzeichen.


Fazit: der Zeichensatz heißt ISO646-DE und nicht ISO-21-German und kann ohne Probleme in Java verarbeitet werden. Und das Mystery Charset gehört ab sofort der Vergangenheit an.


Übrigens: wenn du spannendere Aufgaben mit Java lösen möchtest, wir suchen noch Verstärkung.

Zurück