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