XML::Parser vs. UTF-8
Jiri Polcar
polcar na physics.muni.cz
Pondělí Září 30 15:01:57 MEST 2002
Zdravim,
psal jsem skrip, ktery z XML souboru generuje SQL prikaz. K parsovani
XML jsem pouzil XML::Parser. Ten vraci textove retezce v UTF-8. Zjistil
jsem, ze Perl o promenne vi, ze je v UTF-8 a kdyz ji spoji s
jinou promennou (napriklad v ISO 8859-2), tak vysledek prevede na
UTF-8. Nevim jakym mechanismem se tak deje, to je jedna cast dotazu.
Problem nastal v okamziku, kdy Perl "nevedel", ze promenna je v UTF-8 a
pokusil se ji do UTF-8 znovu prevest. Toho jsem dosahl nevedomky,
pouzitim fce Data::Dumper (viz priklad). K testovani jsem pouzil slovo
"byk" s dlouhym "y" (v TeXove notaci b\'yk).
Kdybych tim nekomu usetril praci, tak slovo "b\'yk" v UTF-8 (hex) vypada
nasledovne:
62 C3 BD 6B
^^^^^
Pokusi-li se ho Perl znovu prevest do UTF-8, vrati neco takoveho:
62 C3 83 C2 BD 6B
^^^^^^^^^^^
1) Jak Perl vi, v jakem kodovani jsou textove retezce pouzite primo ve
skriptu.
2) Kde je ulozena informace o kodovani dane textove promenne? Je vubec
nekde ulozena?
3) Lze nejak menit kodovani, ve kterem Perl pracuje?
4) Jak mam vyresit svuj problem, tedy, jak mam Perlu rict, ze vse je v
UTF-8, at se "nestara"?
Diky.
--
JP
Prikladam testovaci skripticek. Cast __DATA__ obsahuje XML kod,
ktery obsahuje dva tagy: <tag1> a <tag2>. Oba obsahuji slovo "b\'yk".
Upozornuji na to proto, ze nevim co se s kodovanim po ceste stane.
#!/usr/bin/perl -w
use XML::Parser;
use Data::Dumper;
undef $/;
$_ = <DATA>;
$prsr = new XML::Parser( Style => 'Tree' );
$p = $prsr->parse( $_ );
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 0;
$s1 = Dumper( $p->[1]->[8]->[2] );
$s2 = $p->[1]->[4]->[2];
print "\n$s1\n$s2\n";
__DATA__
<?xml version="1.0" encoding="iso-8859-2" ?>
<!DOCTYPE record SYSTEM "record.dtd">
<record>
<tag1>býk</tag1>
<tag2>býk</tag2>
</record>
Další informace o konferenci Perl