Durch Zufall bin ich heute über ein Projekt gestoßen, womit man das ganze wohl ziemlich streßfrei konvertiert kriegt. Dort gibt es uconv, das ähnlich wie iconv funktioniert, nur zusätzlich auch die Transformation von UTF-8 NFC (Normalized Form Canonical Composition) nach UTF-8 NFD (Normalized Form Canonical Decomposition) versteht.
Praktischerweise versteht uconv auch gleich die gleichen Parameter wie iconv, zum konvertieren von einem Characterset in einen anderen. Also z.B.
chrisbra@host % printf "ä\n€" > charset chrisbra@host % uconv -f iso8859-15 -t utf-8 file1 > file1_converted chrisbra@host % xxd file1_converted 0000000: c3a4 0ae2 82ac 0a .......
konvertiert die datei von iso8859-15 (latin9) nach utf-8 (NFC Form). Wenn man nun in die Form konvertieren möchte, also z.B. von utf8 composed nach utf-8 decomposed wandeln möchte, dann nimmt man noch den Parameter -x hinzu, also z.B.
chrisbra@host % uconv -f iso8859-15 -t utf-8 -x NFD file1 > file1_converted chrisbra@host % xxd file1_converted 0000000: 61cc 880a e282 ac0a a.......
Zurückwandeln kann man dementsprechend mit
chrisbra@host % uconv -f utf-8 -t utf-8 -x NFC file1_converted > file1_nfc chrisbra@host % xxd file1_nfc 0000000: c3a4 0ae2 82ac 0a .......
Und hier noch ein netter Trick, um alle Sonderzeichen in ihre normalen ASCII-Codes entsprechenden Zeichen zu wandeln (also èéê nach 'e'):
Der naive Weg, mit uconv -f utf-8 -t ascii funktioniert leider nicht:
chrisbra@host % cat file_utf8_nfc.txt èéêëē ß ü € Æ Office ế 2⁵ chrisbra@host % uconv -f utf-8 -t ascii file_utf8_nfc.txt Conversion from Unicode to codepage failed at input byte position 0. Unicode: 00e8 Error: Invalid character found
Natürlich, denn die Datei enthält Zeichen, die nicht nach Ascii konvertiert werden können. Man kann aber mit einem Trick dennoch diese Datei nach ASCII wandeln, indem man sie zuerst nach UTF-8 Decomposed wandelt und dann alle nicht-ASCII Zeichen löscht:
chrisbra@host % uconv -f utf-8 -t ascii -x NFD -c file_utf8_nfc.txt eeeee u Oce e 2
Funktioniert aber einige Zeichen gehen noch verloren. Was man jetzt machen kann, ist die Zeichen noch weiter in ähnliche Zeichen zu zerlegen. Dafür gibt es die Normalized Form Compatibility Decomposed (NFKD) Form. Dabei können die Zeichen neu angeordnet werden (bzw. durch ähnliche Zeichen ersetzt werden).
chrisbra@host % uconv -f utf-8 -t ascii -x NFKD -c file_utf8_nfc.txt eeeee u Office e 25
Zumindest die Ligatur ffi (ffi) wurde korrekt nach ASCII gewandelt, leider können die anderen Zeichen trotzdem nicht gewandelt werden. Man sollte sich also bewußt sein, dass immer auch Zeichen verloren gehen können.
Bei iconv kann man in diesem Fall den String "//TRANSLIT", damit die Zeichen in ähnliche ASCII-Zeichen gewandelt werden können:
chrisbra@host % iconv -f utf-8 -t ascii//translit file_utf8_nfc.txt eeeee ss ue EUR AE Office e 2?
Die ganzen Details zu UTF-8 NF(K)C/NF(K)D finden sich natürlich beim Unicode Consortium.






