Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: DanG 18. 07. 2012, 14:55:34
-
Ahoj,
dělám v Perlu program, kde potřebuju zpracovat XML soubor se znaky Unicode. Program mi soubor zpracovává, řekl bych v pořádku. Stejně tak v pořádku zpracovává standardní vstup. Ale nějak to nejde do sebe. Příklad asi bude lepší.
pokus.xml
<soubor>
<tag name="abc">
<xyz/>
<pqr/>
</tag>
<tag name="äbc">
<xyz/>
<pqr/>
</tag>
</soubor>
pokus.pl:
use XML::Simple;
use utf8;
use encoding 'utf8';
$soubor = XMLin("pokus.xml");
print exists $soubor->{'tag'}->{'abc'} ? "Existuje položka abc\n" : "Neexistuje položka abc\n";
print exists $soubor->{'tag'}->{$ARGV[0]} ? "Existuje položka $ARGV[0]\n" : "Neexistuje položka $ARGV[0]\n";
print exists $soubor->{'tag'}->{'äbc'} ? "Existuje položka äbc\n" : "Neexistuje položka äbc\n";
print exists $soubor->{'tag'}->{$ARGV[1]} ? "Existuje položka $ARGV[1]\n" : "Neexistuje položka $ARGV[1]\n";
Po zadání perl pokus.pl abc äbc
mi to vyplivne
Existuje položka abc
Existuje položka abc
Existuje položka äbc
Neexistuje položka äbc
V terminálu mám nastaveno kódování utf-8, soubor je taky v utf-8, v programu používám utf-8, takže by to mělo být kompatibilní, nebo ne? Je potřeba ten standardní vstup nějak upravit?
-
Nebude ten problem v tom XMLin()?
The use of this module in new code is discouraged.
http://search.cpan.org/~grantm/XML-Simple-2.20/lib/XML/Simple.pm#STATUS_OF_THIS_MODULE
-
No můžu zkusit nějaký jiný modul, ale nemyslím si, že by byla zrovna v tomto chyba. Když zadám jméno toho tagu přímo v programu, tak je přece vidět, že to funguje, problém nastane, pokud použiji jako vstup argumenty při spuštění programu. Stejně tak dám-li vypsat
keys $soubor->{'tag'}
, tak mi vypíše oboje abc i äbc.
Zkusím použít to LibXML, co tam nabízejí.
-
Dobrá, tak s LibXML se děje totéž, takže tam ta chyba opravdu nebyla.
-
tohle by mohlo zabrat
say "není utf" unless utf8::is_utf8($ARGV[1]);
print exists $soubor->{'tag'}->{$ARGV[1]} ? "Existuje položka $ARGV[1]\n" : "Neexistuje položka $ARGV[1]\n";
utf8::decode($ARGV[1]);
say "je utf" if utf8::is_utf8($ARGV[1]);
print exists $soubor->{'tag'}->{$ARGV[1]} ? "Existuje položka $ARGV[1]\n" : "Neexistuje položka $ARGV[1]\n";
-
Tak to skutečně nebylo utf. Díky za radu :)