Sziasztok! Probléma akadt... a program kódja UTF8-ban van tárolva az ekezet.pl fájlban.
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use encoding "cp852";
print 1 if(grep $_ eq "Árvíztűrő", @ARGV);
print 2 if(grep $_ eq "Tükörfúrógép", @ARGV);
print 3 if(grep $_ eq "Arvizturo", @ARGV);
print 4 if(grep $_ eq "Tukorfurogep", @ARGV);
Így indítom a programot: perl ekezet.pl Árvíztűrő Tükörfúrógép Arvizturo Tukorfurogep
Eredmény: csak a 3 és 4 számokat látom.
Hogyan tudnám megmondani neki, hogy az ARGV-ből szedett dolgokat is (amik elvileg cp852-esek, mivel a parancssoré is az) UTF-8-ra kódolja?
- 2513 megtekintés
Hozzászólások
Ugyan a Windowshoz sajnos hülye vagyok, de man perlrun, majd irány a -C kapcsoló. Én utf8-as perl progikat "#!/usr/bin/perl -CSDA" sorral szoktam kezdeni a további szívások elkerülése végett.
- A hozzászóláshoz be kell jelentkezni
Megpróbáltam, ugyanaz.
c:\>perl -CSDA ekezet.pl Árvíztűrő Tükörfúrógép Arvizturo Tukorfurogep
34
- A hozzászóláshoz be kell jelentkezni
(duplán küldte be ugyanazt, bocsi)
- A hozzászóláshoz be kell jelentkezni
Asszem azért volt rossz tipp az előző, mert a -CA az argv-ről azt mondja, hogy az utf8-ban van, és nálad meg pont nem. Ezt picit benéztem.
A use encoding cp852-t így fejből nem vágom, hogy mit csinál, mint ront el, mit javít meg.
Amit megpróbálnék következőnek: use utf8 maradjon, use encoding cp852-nek viszont huss, majd ezt követően az argv elemeit kézzel konvertálni az Encode::decode('cp852', arg...) függvénnyel, és ennek eredményére játszani el a tesztelést. Ennek szerintem mennie kell. Bár perl esetén sosem lehet tudni, ritka rondán oldották meg benne a Unicode sztringkezelést :-)
Ha ez sem megy, akkor először is biztos ami biztos az argv cuccokról megnézném, hogy nem utf8-e a perl szerint, konkrétan hogy az Encode::is_utf8 függvény hamisat ad-e rájuk. Arra számítok, hogy igen. Következő lépésként az argv értékét kéne valahogy hexdumpolni, megnézni byte-ról byte-ra, kideríteni hogy tényleg cp852 kódolásban áll-e, vagy esetleg valami másban...
- A hozzászóláshoz be kell jelentkezni
http://snaury.livejournal.com/tag/perl
legalsó nagy doboz... talán segít...
- A hozzászóláshoz be kell jelentkezni
Nem segített, de látom nem én vagyok egyedül akit büntet az élet.
- A hozzászóláshoz be kell jelentkezni
sztem annyi kene bele, hogy ha nem utf-8 a az input akkor atrakja abba, felteve ha grepnel te utf-8 ban irtad be.
egyik lehetoseg
if (!(utf8::is_utf8($ARGV[0])))
{
utf8::decode($ARGV[0]);
}
print 1 if(grep $_ eq "Árvíztűrő", $ARGV[0]);
van masik lehetoseg is de sztem ez lesz a bajod
- A hozzászóláshoz be kell jelentkezni
Megpróbáltam, amit írtál (lásd alább, hogy ne szűküljön a keret).
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy hülyeség, de meg lehetne próbálni fordítva is: az összehasonlítási alapul szolgáló szöveget át lehetne alakítani 852-es karakterkészletűre az összehasonlítás előtt, így két egyező karakterkészletű szöveg lenne összehasonlítva.
:)
- A hozzászóláshoz be kell jelentkezni
Megpróbáltam macskas ötletét, nem működött ez se.
Futtatott kód
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use encoding "cp852";
if (!(utf8::is_utf8($ARGV[0])))
{
utf8::decode($ARGV[0]);
}
print 1 if(grep $_ eq "Árvíztűrő", $ARGV[0]);
print 1 if(grep $_ eq "Árvíztűrő", @ARGV);
print $ARGV[0];
Eredmény
C:\>perl ekezet.pl Árvíztűrő
"\x{00fb}" does not map to cp852.
"\x{00f5}" does not map to cp852.
Árvízt\x{00fb}r\x{00f5}
Ha kiszedem az új kódrészletet, akkor is ugyanez az eredmény.
- A hozzászóláshoz be kell jelentkezni
up!
- A hozzászóláshoz be kell jelentkezni
up!
- A hozzászóláshoz be kell jelentkezni
ha tudsz vmi shellt adni windowsodra, meg tudom oldani menjen. mert sajat szememmel szeretnem latni, hogy mi a hiba, mert nalam tokeletesen mukodik, windows meg linux alatt is.
ez a windows amin neztem (lehet nem szamit, de torrentes(tehat valszeg mindenfele dologgal patchelt) win, erdeti(sajat) key el aktivalva)
OS Name: Microsoft Windows XP Professional
OS Version: 5.1.2600 Service Pack 3 Build 2600
System Locale: en-us;English (United States)
Input Locale: en-us;English (United States)
ez meg a perl:
perl -v: This is perl, v5.8.8 built for MSWin32-x86-multi-thread
- A hozzászóláshoz be kell jelentkezni