Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: DanG 18. 07. 2012, 14:55:34

Název: Perl – XML a Unicode
Přispěvatel: 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
Kód: [Vybrat]
<soubor>
        <tag name="abc">
                <xyz/>
                <pqr/>
        </tag>
        <tag name="äbc">
                <xyz/>
                <pqr/>
        </tag>
</soubor>

pokus.pl:
Kód: [Vybrat]
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í
Kód: [Vybrat]
perl pokus.pl abc äbc mi to vyplivne
Kód: [Vybrat]
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?
Název: Re:Perl – XML a Unicode
Přispěvatel: Pavel 18. 07. 2012, 16:43:37
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
Název: Re:Perl – XML a Unicode
Přispěvatel: DanG 18. 07. 2012, 17:14:14
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
Kód: [Vybrat]
keys $soubor->{'tag'}, tak mi vypíše oboje abc i äbc.

Zkusím použít to LibXML, co tam nabízejí.
Název: Re:Perl – XML a Unicode
Přispěvatel: DanG 18. 07. 2012, 17:23:13
Dobrá, tak s LibXML se děje totéž, takže tam ta chyba opravdu nebyla.
Název: Re:Perl – XML a Unicode
Přispěvatel: wamba 18. 07. 2012, 19:38:18
tohle by mohlo zabrat
Kód: [Vybrat]
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";

Název: Re:Perl – XML a Unicode
Přispěvatel: DanG 18. 07. 2012, 20:14:44
Tak to skutečně nebylo utf. Díky za radu  :)