perl és a magyar nyelv ékezeti

sziasztok!

van valami megoldás, hogy win környezetben, ahol a konzol kódlapja 852-es és magyarul ír az ember, ott a perl tudjon ékezese kimenet/bemenetet kezelni? olvasom a hup-on és más helyen erről a témáról kezdett beszélgetéseket, de mintha mindenhol csak félmegoldások lennének (amiket eddig találtam!). az ékezetlen szöveg nem megfelelő megoldás, ha userrel akarok kommunikálni, tehát kell idővel jól működő megoldás. sőt, az OS is kommunikál vissza és ott is fel kell dolgozni valahogy az ékezetes értékeket.

ki miféle megoldással oldja meg ezt a problémát?

Hozzászólások

> van valami megoldás, hogy [...] a perl tudjon ékezese kimenet/bemenetet kezelni?

Van. Konkrétan mi a problémád?

azt hittem az a sok guglin talált panasz, kérdés, megoldási próbálkozás arra utal, hogy ez tényleg problémás :) emiatt volt kicsit alulparaméterezett a kérdésem, mea culpa.

a probléma az, hogy szeretném, ha win-en futó perl scriptjeim rendesen, magyar ékezetekkel tudjanak írni a konzolra, illetve a konzolra írt sorokat fel tudják olvashatóan dolgozni. egyelőre nem tudom mi lehet a baj, de egy biztos, a sima árvíztűrő tükörfúrógépet sem sikerült még kiíratnom rendesen a konzolra (jelen esetben megelégszem a karakteres felülettel, egyelőre nem akarok ablakokat gyártani)

--
xterm

> a sima árvíztűrő tükörfúrógépet sem sikerült még kiíratnom rendesen a konzolra

Nincs a közelemben win, nem teszteltem:



# a program szöveg kódolása cp1250, a konzolé pedig cp852
use encoding cp1250, STDOUT=>cp852;

print "\nárvíztűrő tükörfúrógép\n";

Futtatás előtt nézz bele a szövegbe valami hexa editorral. Ha az 'á' betű helyén 'C3A1' van, akkor a szöveg UTF8 kódolású; ha 'A0', akkor CP852; ha pedig 'E1', akkor CP1250.

köszi! kifelég tökéletesen működik látszólag. viszont nem tudom, hogy vajon csak én nem vágom miképp kell, vagy esetleg más trükk is kell ahhoz, hogy a perl script "befele is értse" a win üzeneteit. arra gondolok pl., hogy pl. egy open segítségével pipe-olok be (jujj, micsoda szó) valamilyen parancs kimenetet, ahol van ékezetes karakter is. kipróbáltam és felsírt, hogy nem 852-es kódlapra veló tartalom is jött... erre is van esetleg valami javaslatod? "kifele" már tudok, ezt köszi! :)

--
xterm

> hogy a perl script "befele is értse" a win üzeneteit.


# http://perldoc.perl.org/encoding.html
use encoding cp1250, STDIN=>utf8, STDOUT=>cp852;

> hogy pl. egy open segítségével


# http://perldoc.perl.org/PerlIO/encoding.html
open fajlocska, '<:encoding(utf8)', '/path/filename.ext';

Én pl.ékezetes betűket használok...

Nem tudom segít-e rajtad, de a konzol kódlapja átváltható. chcp parancs.

ezzel próbálkoztam legelőször. a kódlap nálam cp852-es. próbáltam kiírni rá és "cserélgetéssel" kitalálni, hogy mi lehet a kódlap, amilyen módban ír a perl kimenetet. nem jártam sikerrel. itt kezdtek guglizni többet és csak azt láttam, hogy meglepően sok kérdés van erre és igazi megoldást nem láttam, csak gányolásokat (mint például kiírásonként konvertálgatni minden egyes stringet). azt hittem, hogy majd szépen egyszerűen átállítok valamit (mert pl. a default kódlap nem jó) és máris szép az élet. és roppantul nem :) e végett próbálkoztam itt.

--
xterm

Es a forrast milyen kodlappal irtad ?

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

többféleképp próbáltam, mint alternatív megoldás. (notepad++ a program, amivel a legtöbbször csinálok ilyet). beállítottam a file kódolást pl. utf-8-ra (chcp 65001), elmentettem a filet utf8ban és próba. hibás. elmentettem ansi kódolással és próbálgattam alá belőni chcp-vel kódlapot. még nem sikerült... :/

--
xterm

nem lehet valahogy inkább rávenni a perl-t, hogy ha már win32-re megcsinálták, akkor tudjon win32-n szokásos kódlapokkal boldogulni? (úgy értem, hogy valami opció, vagy bármi, csak ne nekem kelljen utólag a file-okat konvertálgatni ide oda, miután megírtam a scriptet, mert ez kényelmetlenségeket szül)

--
xterm

köszi a tippet, megnézem azt is mire jó. bár holnaptól pár napig parkolni rakom a dolgot szükséges távollétem miatt, de ígérem megnézem, hátha jó arra, amire szeretném.

különben, ha buta, akkor miért nem működik úgy, mintha tényleg buta lenne? (pl átállítom a konzolt utf8-ra és utf8-ban mentem a filet, majd írok konzolra). nem lehet, hogy mégis konvertálgat valamit?

--
xterm

Jól értem, hogy a perl forrás tartalmaz utf8 stringeket?

Mert ebben az esetben kell az use utf8; ezzel arra utasítod a perlt, hogy a forrást értelmezze utf-8-ként.

update:

Ez nálam (Win XP, Camelbox perl 5.10.0) működik:


use strict;
use warnings;
use utf8;

$s = "öt szép szűzlány őrült írót nyúz";
binmode STDOUT, ":encoding(cp852)";

print $s;

Jótanács és megjegyzés:

A perl alapból azt feltételezi, hogy a forrás ISO-8859-1 kódolással van írva, azaz ha 128-nál nagyobb kódú karaktert lát a forrásban, akkor eszerint értelmezi. Ez abból a szempontból szerencsétlen, hogy a magyar ő és ű betűket nem lehet ezzel a kódolással reprezentálni.

Ellenben az említett use utf8-cal rákényszerítheted, hogy a forrást utf-8-nak lássa, ekkor csak arról kell gondoskodnod, hogy tényleg akként is mentsd el a forrásodat.

Mellesleg a perl nem buta; nagyon is okos a kódolásokkal kapcsolatban. Csak éppen ki kell ismerni és a lehetőségeit ki kell tudni használni. A te helyzetedben nehezítés a Win32 platform, ami jó néhány nemtriviális akadályt gördít a perl elé.

a notepad plus-om alapból nem utf8-ra volt állítva, hanem ansi. de utf8-ra átkódolva se volt igazi az eredmény. úgyhogy ott lesz a kutya elásva, ahol mondod. magyarán, ő feltételez valamit, amit nem tudok. pontosabban nem tudtam, de köszi szépen a kiegészítést. ahogy fentebb egy másik hozzászólásra írtam, már csak egy gondom van. hogy tudom a wines parancssorból érkező bemenetet is a megfelelő formában megemészteni. mert ha a te binmod operálásodat összevetem, ne adj isten kombinálom a kolléga javaslatával, akkor csak az egyikteké lesz jó. mármint attól függően melyiket hagyom benne a kódban. mindenesetre jó tippeket adtatok, próbálok így is keresgélni valami jó leírás után, ahol meg tudom érteni mi az oka a problémámnak és hol találom a helyes megoldást. szóval ettől függetlenül is nagyon köszi!

--
xterm

Control Panel -> Regional and Language Options -> Advanced tab

Mi van beállítva non-unicode programokhoz?