Tegnap egész nap újfent karakter kódolásokkal vacakoltam python 2-ben, mert mint említettem a pdf reader részben volt egy nem triviális hack, amiről azt hittem, hogy problémát okoz. Hát a hack az valóban hack volt, de nem okozott problémát. :)
Először is a pdf nem adatcserére való. Ez persze mindenki számára nyilvánvaló, aki kicsit is ért a dolgokhoz… mennyivel egyszerűbb lenne, ha xml-ből kéne xml-t csinálnom. :) Na de ezt küldik, ezzel kell kezdeni valamit, és amúgy is, azt hiszem ami xml-t küld az oep, annak is iso-8859-2 a kódolása! Nem utf-8 – abszurd lenne! – és még csak nem is windows-1250! :)
Szóval a tegnapi napom azzal ment el kb., hogy próbáltam megtalálni a hiba okát, – extra szóközök az adatfolyamban – és ezért átnéztem a python 2 és 3 dokumentációját, néztem egyszerű pdf 1.3 syntaxt, számtalan debug print-et csináltam a programból, mire rájöttem a következőkre:
- Windows alatt a c-python alapból 16bites unicode-ba kódol, linux alatt 32bites belső kódolás a default.
- A pdf syntax-ot olvasva kiderült, hogy kb. úgy működik, ahogy gondoltam, és a kód, ahogy átírtam a readert olyan, amilyennek lennie kell.
- És így az extra karakterek nem szóközök, hanem null karakterek az adott unicode környezet byte-számától függően.
- Szóval a hacket kitöröltem, minden létező string-et átírtam pythonban unicode stringre – bár ezt inkább csak a következetesség kedvéért – és próbáltam keresni egy karakter encodert, ami normálisan olvassa az adatot unicode-ból.
- De valójában a kódolás is mindegy, hiszen ha bármit is írok, az a python ‘belső magánügye’, hogy hány biten tárolja, szóval nekem nem kéne látnom annyi extra null karakter, amit látok.
- Tehát valahol mégis csak van egy alap ascii konverzió valamelyik függvénynél, amit használok, (ami megpróbálja 8-bites stringként kezelni a több bites unicode byte stream-et,) annak ellenére, hogy már minden stringem unicode string.
- Szóval próbáltam átírni 1-2 függvényt saját implementációra, és amikor olvastam a dokumentációt, akkor láttam, hogy valóban, az egyik module (StringIO) c implementációja nem támogatja a unicode-ot, csak a python implementáció.
Szóval kitöröltem minden debug szemetet meg a hack-et is… kitöröltem a kódból EGY karaktert, és minden szép és jó azóta. True story.
Aztán hogy a munkahelyi környezetben mi lesz, az egy más kérdés, de ha rajtam múlik persze mindenhol unicode/utf-8. :) Mindenesetre poén, hogy nem eldobja a unicode inputot az ezt nem támogató class… hanem itt-ott tök más helyeken látsz unicode meg ascii errort. A programozás szépségei – még jó, hogy szeretem csinálni. :)