[Vienna-pm] Re: unicode
peter pilsl
pilsl at goldfisch.at
Wed Sep 29 16:29:17 CDT 2004
Peter J. Holzer wrote:
>
> Das Flag ist weder "gut" noch "schlecht", es dient dazu, zwei
> Datentypen zu unterscheiden. Wenn es gesetzt ist, repräsentiert die
> Bytefolge C3 A4 ein "ä", wenn es nicht gesetzt ist, repräsentiert sie
> die zwei Zeichen mit den Codes C3 und A4 im lokalen Zeichensatz (in
> Latin-1 LATIN CAPITAL LETTER A WITH TILDE und CURRENCY SIGN).
>
Vielen 1000 Dank.
... und der character E4 ist dann eine "zusammenfassung" der folge C3 A4
bei gesetztem utf8-flag ?! (E4=ä in der unicode-table)
Ich hab mir dein script im anderen posting angesehen (danke !!). Dein
Beispiel sortiert bei mir auch richtig. Aber generell sortiert es bei
mir falsch. Probier mal ä ö ü a b. Das ergibt bei mir a ö ä ü b !! Und
das ist falsch.
Um nun völlig weg von allem terminal und evtl. eingabeproblemen (und
auch weg von "binmode :utf8" zu kommen, hab ich mir ein kurzes Beispiel
überlegt (source unten), dass intern ein Array (61,c3a4,c3b6,62) also
(a,ä,ö,b) bzw. (a,ä,ü,b) erzeugt, dann upgraded und alternativ dazu
encoded und jeweils sortiert.
In allen Fällen ist zumindest hier bei mir die Sortierung falsch. Das b
ist immer das letzte Element. (Ich benutze locale und explizit LC_COLLATE)
upgrade u encode tut hier übrigens nicht das gleiche, obwohl ich das
eigentlich erwartet habe. upgrade ist ein nop, die nur das utf8-flag
setzt. encode setzt auch das utf8-flag, aber fasst eben auch c3a4 zu dem
character e4 zusammen.
Obwohl das intern sicher immer noch ein c3a4 ist, aber wie wird das dann
unterschiedlich interpretiert? in beiden fällen ist das utf8-flag
gesetzt, trotzdem gibt es als ergebnis einmal den character e4 und
einmal die bytefolge c3a4. Wie unterscheidet perl das intern? Das
utf8-flag ist es offenbar nicht.
Das script:
zu jedem string werden über die methode ustat auch ein hexdump und die
utf8-flags ausgegeben.
--------------------------------------
#!/usr/local/bin/perl -w
use strict;
use POSIX qw(locale_h);
use locale;
setlocale(LC_COLLATE, "de_AT");
my $r;
my @d=("\x{61}","\x{c3}\x{a4}","\x{c3}\x{b6}","\x{62}"); # a ä ö b
my @d1=map {my $x=$_;utf8::upgrade($x);$x} @d; # set the utf8-flag
my @d2=map {my $x=$_;utf8::decode($x);$x} @d; # decode
$r.=ustat(join("",sort @d));
$r.="====\n";
$r.=ustat(join("",sort @d1));
$r.="====\n";
$r.=ustat(join("",sort @d2));
print $r,"\n";
sub ustat{
# print a string, its hexdump and utf8-status
my $s=shift;
my $r='';
$r.=$s." (l=".length($s).")\n";
foreach my $i (0..length($s)-1) {
$r.=sprintf ("%x",ord(substr($s,$i,1)))."-";
}
$r.="\n";
$r.="valid ".(utf8::valid($s)?"yes":"no")." - ";
$r.="is_utf8 ".(utf8::is_utf8($s)?"yes":"no")."\n";
}
--------------------------------------
vielen dank,
peter
ps: ein string der art 61 c3 a4 62 mit ungesetztem utf8-flag ist auch
exakt das, was das CGI-Modul an parametern liefert.
pps: Ich hab das alles auf zwei System ausprobiert mit dem gleichen
ergebnis:
System1: mandrake 8.1 - linux 2.4.24 - perl 5.8.5 glibc2.2.4
System2: mandrake 10.0 - linux 2.6.3 - perl 5.8.3 glibc2.3.3
--
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