Zmateny perl z kodovani
Ondrej Koala Vacha
koala na vju.cz
Středa Leden 19 09:11:17 MET 2005
Dobry den,
perl, jak znamo, od nejake doby pracuje interne v unicode. A pomoci
direktiv use open a use encoding by se melo zajistit, aby se spravne vse
prevadelo.
Mam modul, ktery pracuje s databazi pomoci DBI modulu. Pracuji jeste stale
v iso-8859-2, taktez databaze je tomto kodovani. Na zacatku modulu mam:
use open ":encoding(iso-8859-2)";
use encoding 'iso-8859-2';
A ted: nactu z pomoci DBI z databaze nejake udaje v iso-8859-2, bez
problemu jdou vytisknout. Potiz nastane, jak nad nimi provedu nejakou
operaci, kde se predpoklada interni format, napr. zamenu vice mezer za
jednu:
$a = s/ +/ /og;
Zde zrejme perl predpoklada kodovani interni, ale ono je iso-8859-2, a tak
vysledek dopadne spatne.
Priklad: k replikaci je treba mit tu databazi, takze prikladam pouze
neslavny vysledek. Z databaze se nacetlo "Krůtí křídlo horní"
$ perl test.pl
"\x{b64b2f}" does not map to iso-8859-2 at test.pl line 18.
"\x{d82d}" does not map to iso-8859-2 at test.pl line 18.
Krůtí k\x{b64b2f} horn\x{d82d}
Chapu, ze je to predevsim problem DBI a jeho zrejme zvlastniho zpusobu
cinnosti, ale neexistuje nejaka funkce, ktera toto elegantne resi? Zatim
to delam pomerne slozite, tedy:
$a = Encode::decode('iso-8859-2',$a); # prevadim do perl internal format
$a = s/ +/ /og;
$a = Encode::encode('iso-8859-2',$a); # prevadim zpet do iso-8859-2, i
# kdyz by se to mohla zdat zbytecne, ale bez toho jsou funkce print nebo
# write opravdu, ale opravdu zmatene :(((
s pozdravem
--
Ondrej Koala Vacha
Další informace o konferenci Perl