[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