[Vienna-pm] unicode-debakel

peter pilsl pilsl at goldfisch.at
Mon Sep 22 06:53:49 CDT 2003


Hallo,

perl 5.8.0 unter linux

Ich scheitere seit geraumer Zeit daran, unicode-daten korrekt von einem utf-8
webform mittels CGI nach perl und weiter nach postgreSQL zu verarbeiten. In
jedem Schritt scheint es hier gravierende Probleme zu geben.

Aber ich verstehe auch die perlinterne unicode-abarbeitung nicht. Anbei ein
kleines script (ohne CGI und SQL, nur perl), das im wesentlichen ein array mit
unicode-strings erstellt, dessen inhalt in kleinbuchstaben umwandelt und dann
sortiert und ausgibt.

Die Sortierung soll dabei nach deutscher lexiographie erfolgen. dh: A,Ä,B
.,O,Ö,P ...

Vorweg : das script scheitert in allen punkten. Weder schafft es die umwandlung
von grossen deutschen umlauten in die entsprechenden Kleinbuchstaben, noch
schafft es die Sortierung.  Bei der Umwandlung werden die unicode-chars
ignoriert und bei der sortierung wird scheinbar stur nach dem ersten byte
vorgegangen.
Verwirrendes Detail : wenn ich alle unicode-chars >00ff entferne, funktioniert
plötzlich alles, vermutlich weil dann perl intern eine 8-bit-darstellung
verwendet. Das kann man im Script sehr deutlich nachvollziehen, indem man die
zeile mit dem smiley auskommentiert.
Ich bin mit meiner Weisheit am Ende. Ich habe alle bytes, encoding- und
utf8-pragmas ausprobiert, alle möglichen locale-settings usw. usf.
Ich krieg es nicht auf die Reihe.  Die Anforderung ist doch nicht so hoch :
lowercasen und sortieren von unicodestrings.


Bin für jede Idee sehr dankbar,

peter



=============================================
#!/usr/bin/perl -w

use strict;
use locale;
use POSIX qw(locale_h);

print setlocale(LC_CTYPE),"\n";
#setlocale(LC_CTYPE,"de_AT");
#print setlocale(LC_CTYPE),"\n";
#binmode(STDOUT,":utf8");

my @s;
p("\x{263a} this is a smiley");   # <== COMMENT THIS LINE TO SEE DIFFERENCE
p("\x{00e4} this is lower german umlaut-a");
p("\x{00c4} this is upper german umlaut-A");
p("\x{00d6} this is lower german umlaut-o");
p("\x{00f6} this is upper german umlaut-O");
p("a this is a lower a");
p("A this is a upper a");
p("z this is a lower z");
p("b this is a lower b");
p("B this is a upper B");
p("p this is a lower p");
p("P this is a upper P");
p("o this is a lower o");
p("O this is a upper O");


@s=map { lc } @s;
@s=sort map {$_." (".sprintf("%04x",ord(substr($_,0,1))).")"} @s;
print join("\n", at s),"\n";

sub p{
  my $s=shift; #print utf8::valid($s);
  push(@s,$s);
}
=============================================


-- 
IT-Consulting
mag. peter  pilsl
tel:+43-699-1-3574035
fax:+43-699-4-3574035
pilsl at goldfisch.at
http://www.goldfisch.at






More information about the Vienna-pm mailing list