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