Discussion:
modperl2 ei jaga UTFi
(too old to reply)
Gunnar Koppel
2006-05-26 07:42:56 UTC
Permalink
Terr!

Säärane takistus mu teel, et ei õnnestu modperl2 all kuidagi UTF8
normaalselt toimima saada. Testimiseks kasutan sellist skripti:

-------
#!/usr/bin/perl

use strict;
use locale;
use utf8;
binmode stdin, ":utf8";
binmode stdout, ":utf8";

my @alpha = qw(a b c d e f g h i j k l m n o p q r s š z ž t u v õ ä ö ü
x y);
print "Content-Type: text/plain; charset=UTF-8\n\n";
print "LC_CTYPE: $lc\n";
print "\u$_ " foreach @alpha;
print "\n";
-------

See peaks siis tähestiku tähthaaval suureks keerama ja välja printima.
Toimib asi kuni V-ni (st et š ja ž on OK), aga siis lähevad täpilised
koledaks. See skript toimib korralikult käsurealt ja CGI-na, ka on kõik
korras modperl 1 all (nii PerlRun, PerlRegistry kui handleriks
kirjutatuna). Paistab, et modperl2 all konveridakse õäöü miskipärast
ISO8859-x.

Skript (funktsioonaalselt) pole eesmärk omaette, sellega ma lihtsalt
testin UTFi ja locale toimimist.

On kellelgi kogemust ja ideid?

Taust:
SERVER_SOFTWARE: Apache/2.0.55 (Debian) mod_apreq2-20051231/2.5.7
mod_perl/2.0.2 Perl/v5.8.8

Juhuks, kui uudisesüsteemis UTF koledaks läeb, on kood ja väljundid siin ka:
http://wanradt.msn.ee/code.html

Tänud ette,

WK
Priit Randla
2006-05-26 08:42:24 UTC
Permalink
Post by Gunnar Koppel
Terr!
Säärane takistus mu teel, et ei õnnestu modperl2 all kuidagi UTF8
-------
#!/usr/bin/perl
use strict;
use locale;
use POSIX qw(locale_h);
Post by Gunnar Koppel
use utf8;
binmode stdin, ":utf8";
binmode stdout, ":utf8";
setlocale(LC_CTYPE, "et_EE.UTF-8");
# Kas jõuga määratud locale'ga ikka ei tööta?
# Pole vastevat konfiguratsiooni, et saaks ise proovida...
#
# Priit
Post by Gunnar Koppel
x y);
print "Content-Type: text/plain; charset=UTF-8\n\n";
print "LC_CTYPE: $lc\n";
print "\n";
-------
Paistab, et modperl2 all konveridakse õäöü miskipärast
ISO8859-x.
On kellelgi kogemust ja ideid?
Gunnar Koppel
2006-05-26 10:50:23 UTC
Permalink
Post by Priit Randla
setlocale(LC_CTYPE, "et_EE.UTF-8");
# Kas jõuga määratud locale'ga ikka ei tööta?
# Pole vastevat konfiguratsiooni, et saaks ise proovida...
Ei tööta. Postitatud näiteskriptist jätsin välja lokaadi
kontrollimise/kehtestamise osa, kuivõrd see ei mõjuta:
----
use POSIX qw(locale_h);
my $lc = setlocale(LC_CTYPE);
setlocale(LC_CTYPE, "et_EE.UTF-8");
my $lc = setlocale(LC_CTYPE);
----

Veider ongi see, et kõiki märke ei teisendata, šž jäävad UTFi. Peaks
mingi suurema valiku diakriitikuid panema ja siis vaatama.

Nõnda,

WK
Gunnar Koppel
2006-05-26 11:14:14 UTC
Permalink
Lisasin veel diakriitikuid ja panin väljundid siia:

http://wanradt.msn.ee/code.html


Nõnda,

WK
Alo Raidaru
2006-05-26 11:28:07 UTC
Permalink
Post by Gunnar Koppel
Säärane takistus mu teel, et ei õnnestu modperl2 all kuidagi UTF8
Oletan et see modperl2 on mingi programmilaadne asi.
Ja siis on tal kõhus need tähestikud defineeritud.
Kui teda vaadata näiteks UltraEditiga, siis peaks need grupid näha
olema. ABCD on ilusti järjest, aga sela õöä kohal peks midagi muud
olema. Või pole kohtagi. Kui ta šž kätte saab siis saab vast ka need
õnnetud sinna sokutada.

Ja vast oleks testiks hea tekst ka kuskile mujale kui printerile saata.
Selle printimisega on olnud rohkem jama kui näitamisega.

A.R.
Gunnar Koppel
2006-05-26 11:44:34 UTC
Permalink
Post by Alo Raidaru
Oletan et see modperl2 on mingi programmilaadne asi.
modperl on õigupoolest Apache'i moodul, mis võimaldab Perli tihedamalt
Apache'iga lõimida ja sellega efektiivsemat dünaamilist veebi tekitada.
Post by Alo Raidaru
Ja siis on tal kõhus need tähestikud defineeritud.
Ei, seda kindlasti mitte. Pole põhjust tähestikke defineerida.
Post by Alo Raidaru
Ja vast oleks testiks hea tekst ka kuskile mujale kui printerile saata.
Selle printimisega on olnud rohkem jama kui näitamisega.
Tegelikult print ongi perlis "näitamise" käsk, mis vaikimisi kõik talle
ettesöödetu STDOUTi suunab.

Aga kui Sa vaatad mu väljundeid lehel http://wanradt.msn.ee/code.html ,
kas Sa ei näe mingit ühisosa märkidel, mis ära näritakse? Või on ühisosa
just neil, mida ära ei närita?


Tänud ette,

WK
Alo Raidaru
2006-05-26 17:01:38 UTC
Permalink
Post by Gunnar Koppel
modperl on õigupoolest Apache'i moodul, mis võimaldab Perli tihedamalt
Apache'iga lõimida ja sellega efektiivsemat dünaamilist veebi tekitada.
Kena. Mul on silumiseks kasutusel Apache'i TomCat55 koos jsp ja Javaga
Post by Gunnar Koppel
Ei, seda kindlasti mitte. Pole põhjust tähestikke defineerida.
Nonohhh. Vaata UTF8 all on tuhandeid tähti. Server päris kindlasti neid
kõiki ei oska. Aga kuskil on kirjas mida ta oskab.
Kunagi ca 98. ma valasin selle pärast netis pisaraid.
Post by Gunnar Koppel
Tegelikult print ongi perlis "näitamise" käsk, mis vaikimisi kõik talle
ettesöödetu STDOUTi suunab.
Kui kuidagi sealt vahelt saaks vaadata. Sest kui üks ots on korras ja
teine pole, siis kuskil seal vahel on üks punkt.

/*
Füüsikud räägivad et on olemas kaugus kus näised näivad kõige kenamad.
Tõestus.
Nina vastus nina ei näe midagi.
Lõpmatu kaugel ei näe ka midagi.
Järelikult seal vahel on SEE kauguspunkt. :)
*/
Post by Gunnar Koppel
Aga kui Sa vaatad mu väljundeid lehel http://wanradt.msn.ee/code.html ,
kas Sa ei näe mingit ühisosa märkidel, mis ära näritakse? Või on ühisosa
just neil, mida ära ei närita?
Tegin siin omale testiks jsp.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML><HEAD><TITLE>UTF8 JSP</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD><BODY>
Nii see ei käi kohe mitte<br>
S Š Z Ž T U V Õ Ä Ö Ü X Y<BR>
s š z ž t u v õ ä ö ü <BR><BR>
<%

String UTF="c3 9 ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß<BR>"+
"c3 9 Ɛ Ć‘ Ć’ Ć“ Ć” Ć• Ć– Ć— Ƙ Ć™ ƚ Ć› Ɯ Ć¯ Ʋ Ɵ <BR>";
out.print("SIIN<BR>"+UTF+"<BR>nots");
%>
</BODY></HTML>

Kopeerimisel see String muutub ja ma ei saa siia kirja õiget rida
copytud. :)
(Aga seal oli see c3 9 rida, millest ma siin lõpus räägin.)

Kui käivitub siis ei lähe UTF-8 ks ja alumine rida on jama.
Kui viia jõuga CODE UTF8 siis all on korras.

***
Kui viitsid proovida siis:

Mine http://www.hot.ee/araidaru/utf8-3.htm
Seal näed kuni kolmebaidiseid UTF8 koode.

Vali näiteks rida c3 8 või c3 9.
ja pane see oma teksti.

Enne muuda View coding näiteks Westerniks (nt ISO-8859-13).
Siis näed seal topelttähti.
Kopeeeri need topelttähed sinna oma stringi.

Sellel juhul string on aus western ja su Perl võiks temase ka nii
suhtuda. Ainult see "näitamine" peab ta UTF8-ks tegema.

See proovimine ei maksa ju midagi.
Aga vanasti mul õnnestus nii UTF8-t teha.
Kõik keeled segi.
(See test on ka aastast 98.)

A.R.
Gunnar Koppel
2006-05-26 20:48:19 UTC
Permalink
Post by Alo Raidaru
Post by Gunnar Koppel
Ei, seda kindlasti mitte. Pole põhjust tähestikke defineerida.
Nonohhh. Vaata UTF8 all on tuhandeid tähti. Server päris kindlasti neid
kõiki ei oska. Aga kuskil on kirjas mida ta oskab.
No võib-olla panen ma millegagi mööda, aga mu arust käib see asi umbes
nii, et süsteemis on defineeritud lokaadid (sh: mis baidijadad on selle
keele tähed, mis baidijadad on nende suurtähelised vasted ning
defineeritud järjestus sorteerimiseks). Perl kasutab vaikimisi
C-lokaati, aga kui talle öelda, et tahad eesti oma kasutada, siis
paremal juhul võtab ta sind kuulda ja haarab süsteemi lokaadist vajaliku
info. Sellest tulenevalt pole mingit mõtet neid modperlil defineerida.
Ma ei tea, kas see on kõige õigem väljend, aga modperl on mu arust
teatud kapseldusmehhanism perli-skripti ümber. Ilmselt on ses kapslis
mingi mõra UTF-iga ümberkäimisel.
Post by Alo Raidaru
Post by Gunnar Koppel
Tegelikult print ongi perlis "näitamise" käsk, mis vaikimisi kõik
talle ettesöödetu STDOUTi suunab.
Kui kuidagi sealt vahelt saaks vaadata. Sest kui üks ots on korras ja
teine pole, siis kuskil seal vahel on üks punkt.
Nõus. Perl omapäi saab hakkama. Perl CGI-na saab hakkama. Isegi vanem
modperl1 saab hakkama. Aga uuemas on viga sees. Kuidagi tuleks viga üles
leida.

Kui ma kommenteerin välja read:
# binmode stdin, ":utf8";
# binmode stdout, ":utf8";
siis saan ma ka skriptina jooksutades sama tulemuse, mis modperl2-s.
Sellest tulenevalt arvan, et kusagil väljundis kaob modperlil see UTFi
lipuke küljest ära.

Siia kirjutades lootsin, et keegi lükkab mu väited ümber ja ütleb, et
viga on kusagil konfis või minu koodis. Seni kahjuks pole seda tehtud.
Post by Alo Raidaru
Kui käivitub siis ei lähe UTF-8 ks ja alumine rida on jama.
Kui viia jõuga CODE UTF8 siis all on korras.
Tunnistan, et ei saanud sugugi kõigele eelnevale piisavalt pihta...
Viitsin ja proovin, kuigi...
Post by Alo Raidaru
Vali näiteks rida c3 8 või c3 9.
ja pane see oma teksti.
Enne muuda View coding näiteks Westerniks (nt ISO-8859-13).
Siis näed seal topelttähti.
Kopeeeri need topelttähed sinna oma stringi.
Miks on vaja need topelttähed oma stringi viia? Seda võiks teha
eeldusel, et need hiljem taas UTFina mõistetakse, aga sellisel juhul
peaks editor need ka 8-bitisena salvestama.
Post by Alo Raidaru
Sellel juhul string on aus western ja su Perl võiks temase ka nii
suhtuda. Ainult see "näitamine" peab ta UTF8-ks tegema.
Aga mu perl tönkab muidu kenasti UTF8-t. Kui ma oma editori kleebin
UTFi, mille esitlus on parasjagu puusse (Western) keeratud, siis ma saan
kleepides midagi, mida ma ise nimetaksin topeltkodeeritud UTFiks.

Tulemus on minu jaoks suht ootuspärane:
http://wanradt.msn.ee/code2.html

Nõnda,

WK
Gunnar Koppel
2006-05-27 10:19:56 UTC
Permalink
Post by Gunnar Koppel
binmode stdin, ":utf8";
binmode stdout, ":utf8";
asemel
Post by Gunnar Koppel
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
Kuigi perlis on stdin ja STDIN (jt vastavad) aliased, ei tunnista
modperl2 neid aliastena. Suurtäheline töötab korralikult. Kas see on
modperlis tahtlikult või mitte, see pole päris selge.

Kusjuures, ma kasutan failhandlereid alati suurtähelisena, ja nüüd
miskipärast just olid väiketähelised, kui modperl2 neid ei tunnista.

Nõnda,

WK
Alo Raidaru
2006-05-28 08:19:51 UTC
Permalink
Post by Gunnar Koppel
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
Õnn tuli meie õuele
au modperli listile

****
Aga see alguse problemm!
Miks osa koode teisndati ja osa mitte.
Ja pahad polnud mitte ainult üõöä.
Ja hed polnud ka ainult š ja ž

Miks nii?

Midagi on seal mäda!

A.R.
Ahto Truu
2006-05-28 21:26:49 UTC
Permalink
Post by Alo Raidaru
Aga see alguse problemm!
Miks osa koode teisndati ja osa mitte.
Ja pahad polnud mitte ainult üõöä.
Ja hed polnud ka ainult š ja ž
Miks nii?
Spekuleerin: vaikimisi arvab Perl, et väljund on ISO-8859-1 ja kõik
asjad, mida selles ette nähtud pole, tehakse UTF8-sse.

Ahto
Alo Raidaru
2006-05-29 12:51:18 UTC
Permalink
Post by Ahto Truu
Spekuleerin: vaikimisi arvab Perl, et väljund on ISO-8859-1 ja kõik
asjad, mida selles ette nähtud pole, tehakse UTF8-sse.
ISO-8859-1 all pole koode 0x8* -0x9*
ja seega võisid ÜÕÖÄ lolliks minna.
Seal on see 0x95, 0x84, 0x96, 0x9c

Samas, üõöä mõlemad osapooled on ka ISO-8859-1 all olemas ja seega
Kui too test oleks trükkinud välja väikesed üõöä siis mine tea.

Kui nüüd keegi prooviks :(

A.R.
Gunnar Koppel
2006-05-29 21:46:01 UTC
Permalink
Post by Alo Raidaru
ISO-8859-1 all pole koode 0x8* -0x9*
ja seega võisid ÜÕÖÄ lolliks minna.
Seal on see 0x95, 0x84, 0x96, 0x9c
Samas, üõöä mõlemad osapooled on ka ISO-8859-1 all olemas ja seega
Kui too test oleks trükkinud välja väikesed üõöä siis mine tea.
Kui nüüd keegi prooviks :(
Ei, selles vahet polnud, kas on tegemist väikeste või suurtega, mõlemiga
käitus ühtmoodi...

Nõnda,

WK

Continue reading on narkive:
Loading...