Ékezetes betű beolvasása (Windows, ActivePerl)

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?

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.

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...

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

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.

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