Chyba 'Wide character in print' pri pouziti XML::Parser
Pavel Šmerk
xsmerk na informatics.muni.cz
Čtvrtek Červen 19 22:58:04 MEST 2003
Honza Pazdziora wrote:
> Byt Tebou, tak si ujasnim, v jakych znakovych sadach chces mit
> jednotliva data, jednotliva zpracovani a jednotlive filehandly, jestli
> tomu co chces odpovida to co mas, a to vcetne takovych veci jako
> locales.
Myslel jsem, ze uz v tom mam trochu jasno, ale asi ne. Chci zaroven
pouzivat XML::Parser vracejici utf8 a zaroven mit zdrojak (chybove
hlasky) v il2. Pokud ale do il2 chybove hlasky vlozim nejaky retezec
vraceny XML::Parserem, perl musi (alespon soudim podle man perluniintro)
"transparentne upgradeovat" cely retezec na utf8. Aby to bylo nejen
transparentni, ale i korektni, musi vedet, ze "moje" retezce jsou v il2.
Myslel jsem si, ze k tomu slouzi use encoding 'latin2'.
Jednak mi neni jasne, proc odmita muj pekny il2 XML soubor (jsou tam
znaky D0 a B3, takze jak il2, tak unicode):
[...]$ cat x.xml
<a>?^(3)</a>
[...]$ cat x.pl
#!/usr/bin/perl -w
use strict;
use XML::Parser;
use encoding 'latin2';
(new XML::Parser())->parse(*STDIN, ProtocolEncoding => $ARGV[0]);
[...]$ perl -MXML::Parser -e 'print join "\n",
@XML::Parser::Expat::Encoding_Path, ""'
/usr/lib/perl5/XML/Parser/Encodings
..
[...]$ ls -l /usr/lib/perl5/XML/Parser/Encodings/iso-8859-2.enc
-rw-r--r-- 1 root root 1072 led 17 2001
/usr/lib/perl5/XML/Parser/Encodings/iso-8859-2.enc
[...]$ ./x.pl ISO-8859-2 < x.xml
not well-formed (invalid token) at line 1, column 4, byte 4 at
/usr/lib/perl5/XML/Parser.pm line 185
[...]$
Co delam spatne? Nejaka chybka ale asi bude i mimo me, protoze
[...]$ ./x.pl ISO-8859-2 < x.xml2
Neoprávni`ný p?ístup do pami`ti (SIGSEGV) (core dumped)
[...]$ ./x.pl ISO-8859-2 < x.xml3
not well-formed (invalid token) at line 298, column 1, byte 29692 at
/usr/lib/perl5/XML/Parser.pm line 185
Neoprávni`ný p?ístup do pami`ti (SIGSEGV) (core dumped)
Soubory x.xml[123] jsou trochu vetsi, proto jsem je dal na
www.fi.muni.cz/~smerk/x.xml[123]. Dalsi podivnost je, ze pokud se ho
pokusim zmast a jako ProtocolEncoding dam UTF-8 (takze predpokladam, ze
perlu o STDIN rikam latin2 a XML::Parseru rikam utf8), zacne to delat
psi kusy:
[...]$ ./x.pl UTF-8 < x.xml1
# zrejme cykli...
[...]$ ./x.pl UTF-8 < x.xml2
Neoprávni`ný p?ístup do pami`ti (SIGSEGV) (core dumped)
[...]$ ./x.pl UTF-8 < x.xml3
not well-formed (invalid token) at line 328, column 51, byte 32772 at
/usr/lib/perl5/XML/Parser.pm line 185
Vsechny tri soubory se pohybuji okolo 32kB a chyby jsou na teto
velikosti docela zavisle. Vypada to, ze u x.xml1 lze 1, 2, 5, 6 nebo 7
znaku ("a") pridat a stale bude cyklit, prida-li se jiny pocet nebo
ubere-li se nejaky, cyklit prestane. U x.xml2 program probehne, pokud se
neco ubere nebo pridaji tri znaky, pokud se pridaji jeden nebo dva, bude
cyklit, prida-li se vice, bude padat. Zmensit pocet ne-a znaku vymenou
za a, aby to stale padalo, se mi nepovedlo. S x.xml3 bude program
cyklit, pokud se dva znaky uberou nebo pridaji, pokud se ubere jiny
pocet, bude fungovat, pokud se jiny pocet prida, bude padat. Ani zde se
mi nepovedlo zmensit pocet ne-a znaku vymenou za a, aby to stale hlasilo
not well-formed (naopak lze misto "aaaa" zrejme psat "?^(3)", ale asi tam
hraji roli i jine faktory). To not well-formed se na rozdil od
predchoziho pripadu netyka znaku, ktery by mohl byt z utf8, ale az
zaverecne znacky.
Uznavam, ze se k perlu nechovam zrovna hezky, na druhou stranu slusny
program by nemel cyklit nebo dokonce padat s coredumpem. Kde by mohla
byt chyba/melo by se to nekam napsat?
P.
Další informace o konferenci Perl