Hogyan lehet unicode-ban (UTF8-8, UTF-16, UTF-32) kódolt file-okat ISO-8859-2 formátumba konvertálni? Pl. azért, hogy az mplayer jól jelenítse meg a a feliratokat. Linux és Cygwin alatt egyaránt felhasználható megoldást kerestem. Meglepetésemre a két rendszer alatti verzió eltérően viselkedik! A Cygwin-es sokkal intelligencsebb.
A parancs az iconv. Az mplayer egyébként tudja közvetlenül is kezelni az iconv könyvtárat a -subcp parancs megadásával. Csak nem mindig működik jól. Az okok számomra érthetetlenek.
A teljes cygwin megoldás:
iconv -f UTF-16 -t L2 --unicode-subst='<%X>' --byte-subst='?%X?' filename
- -f - from. A file eredeti kódolása. A 16, 32-nél problémás lehet, hogy little endian, vagy big endian a kódolás. UTF-16-nál pl. szokott lenne BOM (Byte Order Mark), ami 2 byte: ff fe, vagy fe ff. Az előbbi a little-endian, a második a big endian kódolású. Ha ez nincs, akkor nekünk kell kísérletezni. UTF-16BE, UTF-16LE. Hasonlóan UTF-32-re is. Az összes lehetséges kódolás elnevezését, egyébként az "iconv -l" paranccsal listázhatjuk ki.
- -t - to. Mibe szeretnénk kódoltatni. Az L2 a LATIN2 rövidítése, ami az ISO-8859-2 rövidítése.
- --unicode-subst='<%X>' - Azokat a unicode kódokat, amiket nem lehet átkonvertálni a cél kódkészletbe, hogyan írja ki.
- --byte-subst='?%X?' - A hibás byte-okat hogyan írja ki.
- Az stdout-ra teszi ki a szöveget.
A linux verzió kevesebbet tud:
iconv -f UTF-16 -t L2//TRANSLIT filename
- Itt nem lehet olyan szofisztikáltan lekezelni a hibákat. A //TRANSLIT figyelmen kívül hagyja a konverziónál a nem konvertálható karaktereket.
- A //IGNORE a hibás karaktereket hagyja szó nélkül. Ezeket kombinálhatjuk is "-t L2//TRANSLIT//IGNORE".
A //TRANSLIT és //IGNORE is használható a cygwin-es verzióban is. Annak ellenére, hogy a man page-ben említés sem esik róla.
Konvertálódjunk minden nap!
+jegyzések