[Vienna-pm] Re: unicode

peter pilsl pilsl at goldfisch.at
Tue Sep 28 15:13:59 CDT 2004


Karlheinz Zoechling wrote:

> musst - daher ist es am besten das hin-und-her-gecode generell zu vermeiden 
> und ueberhaupt nur unicode zu verwenden.
<skip>
> alle deine html seiten muessen utf8 codiert sein. das muss auch so im http 
> header stehen (oder zumindest im html <head> als meta http equiv). das gilt 
> sowohl fuer die seiten mit den formularen als auch fuer die seiten die du 
> rausschreibst 
> wenn du dir einmal 100% sicher bist dass die daten die dein programm bekommt 
> in utf8 codiert sind und perl das wirklich nicht mitbekommt dann kannst du 
> versuchen das utf8 flag zu setzen:
> utf8_on($wert);
> 

danke. (utf8_on hab ich weder in Encode noch in utf8 gefunden ...)
Ich verwende 5.8.5 und CGI3.05, also die neuesten Versionen jeweils.

Mein aktuelles Ziel, an dem ich aber scheitere, ist das einlesen eines 
simplen textfields und dessen ausgabe auf drei arten:

* unmodifiziert
* sortiert ( mit - als trennzeichen im string)
* lowercased

Aktuell habe ich dazu folgende Frage:

was heisst UTF8-encoded eigentlich wirklich?

$a="\x{e4}\x{62}";  #  das ist äb
utf8::is_utf8($a) = FALSE !!!???

und wenn ich das auf eine webpage mit utf8-charset schreibe, dann steht 
da auch nur mist.
Ich muss encoden (aber das ist doch schon unicode??!!), dann sehe ich 
auch äb oder ich muss STDOUT auf utf8 schalten.

Es gibt da die eine Variante, wo zB ein ä als zwei bytes/zeichen 
erscheint und eine wo ä eben einfach ein zeichen ist. Welche ist nun 
utf8-encoded?


zu meinem aktuellen Ziel hab ich in den letzten Tagen ca. 100 
demoscripts verfasst, die alle in irgendeinerweise nicht funktioniert 
haben oder nur mit 100.000 decode- u encode, die ich nach gut glück 
solange eingesetzt habe, bis es halt funktioniert hat, ohne zu verstehen.

Aktuell ist ein script online, dass einen String aus einem Formular 
einliest, ihn ausgibt, sortiert ausgibt und lowercased ausgibt.

Das gleiche macht es mit einem Referenzstring, der intern hardgecoded 
ist (als serie von \x{abcd}). Sinnvollerweise gebe ich in das Textfeld 
auch den gleichen String ein.

Und dann passieren Dinge, die ich so nicht will u nicht verstehe.

Der Referenzstring hat das utf8-flag nicht gesetzt, meine Eingabe schon.
warum ?

Der Referenzstring sortiert korrekt, meine Eingabe nicht !!
(a-ä-b-o-ö-p ist korrekt, a-ö-ä-b-o-p ist falsch) warum ?

Der Referenzstring lässt bei lc() die Umlaute gross, meine Eingabe macht 
das zumindest richtig.

Wie kriegs ich hin, dass sowohl meine Eingabe, als auch der hardcoded 
string richtig sortieren *UND* korrekt lowercasen?

Wie muss ich es angehen, damit ich auf die binmode(STDIN/STDOUT,":utf8") 
verzichten kann?  Die Eingabe decoden bzw. die Ausgabe encoden, aber von 
was auf was eigentlich?

Sorry für diese vielen "dummen" Fragen, aber ich beschäftige mich jetzt 
seit einigen Tagen nur mehr mit diesem Thema und mittlerweile ist mir 
eigentlich gar nix mehr klar ...

Irgendwo hab ich das Gefühl, als würde ich irgendwo einen völlig 
falschen Ansatz verfolgen und alles würde eh ganz easy gehen, wenn ich 
nur wüsste wie ... :)


Falls jemand Lust hat (oder ernsthaft mit mir einen bezahlten 
Tutorial-day verbringen will - ich mein das voll ernst - ich verscheiss 
hier Tag um Tag und bin frustriert, weil mir der Knopf nicht aufgehen 
will) :


das script ist online unter

http://www.customers.goldfisch.at/cgi-bin/unicodetest_pm_demo.pl
(das UTF-8 steht im header)

und der source ist
--------------------------------------
#!/usr/local/bin/perl -w

use strict;

# step1: prepare for german locales
use POSIX qw(locale_h);
use locale;
setlocale(LC_COLLATE, "de_AT");

# step2: prepare for unicode
binmode(STDOUT,":utf8");
binmode(STDIN,":utf8");

# step3: prepare for CGI
use CGI;
my $query = new CGI;
my $charset = 'UTF-8';
$CGI::XHTML= 0;
print 
$query->header(-charset=>$charset),$query->start_html(-title=>'Unicodetest');
#print "cgi-version = ",$CGI::VERSION,"<br><br>\n";


#stepA: referencestring

print "<h4>referencestring</h4>";
my 
$sr="\x{00e4}-\x{0062}-\x{00f6}-\x{0061}-\x{006f}-\x{0070}-\x{00c4}-\x{0042}-\x{00d6}-\x{0041}-\x{004f}-\x{0050}";
# ä-b-ö-a-o-p-Ä-B-Ö-A-O-P

print "orig. : ";ustat($sr);
print "sorted :";ustat(usort($sr));
print "lower : ";ustat(lc($sr));


#stepB: my input

print "<h4>your input</h4>";
my $si=$query->param('unicode');
$si=~s/\r|\n//g;  # remove trailing linebreaks
print "orig. : ";ustat($si);
print "sorted :";ustat(usort($si));
print "lower : ";ustat(lc($si));


# stepC : print text-field and finish CGI
print 'enter your text here :',
   $query->start_multipart_form,
   $query->textfield(-name=>'unicode',-size=>100),
   "\n<br>\n",
   $query->submit(-name=>'submit',-value=>'proceed'),"\n",
   $query->endform,"\n";
print $query->end_html;


sub ustat{
   # get a string, print it, its length and its hexdump
   # check for its utf8-ness and print results
   my $s=shift;
   print "<small>";
   print $s," (l=",length($s),")<br>";
   foreach my $i (0..length($s)-1) {
     print sprintf ("%04x",ord(substr($s,$i,1)))."&nbsp;";
   }
   print "<br>\n";
   print "valid ",utf8::valid($s)?"yes":"no"," - ";
   print "is_utf8 ",utf8::is_utf8($s)?"yes":"no","<br>\n";
   print "</small><br>";
}

sub usort{
   # get a string, split by "-", sort and return the joined sorted string
   #
   my $s=shift;
   return join("-",sort split("-",$s));
}
-------------------------------------------------------------------------------- 





danke,
peter

-- 
mag. peter pilsl
goldfisch.at
IT-management
tel +43 699 1 3574035
fax +43 699 4 3574035
pilsl at goldfisch.at


More information about the Vienna-pm mailing list