[Vienna-pm] locales, umlaute, sortierung ...

peter pilsl pilsl at goldfisch.at
Tue Nov 9 05:09:41 PST 2010





ich hab das problem für mich mal elegant gelöst, indem ich ned die strings direkt sortiere, sondern vorher

s/\s/aaaa<skip noch mehr a's>aa/g; 

also jedes leerzeichen durch ganz viele aaaaaa's ersetze. vermutlich wären viele 0000000er noch schlauer:)

jaja, the high art of trained perl-monks ;)

auch noch spannend in dem zusammenhang:


(echo zumm; echo " zumm"; echo " zamm"; echo "xumm"; echo " xumm") | LC_ALL=de_AT.utf-8 sort
xumm
 xumm
 zamm
zumm
 zumm

das leerzeichen wird in der sortierung offensichtlich ignoriert. (und zwar ned nur leading leerzeichen, sondern das gleiche ergebnis wenn überall noch ein a davor ist ... "axumm" "a xumm" usw.)

das deckt sich mit dem was Lars auch rausgefunden hat. Es ist also kein POSIX-Problem sondern offenbar gewollt.
aber da muss es einen eleganteren workaround geben als meine methode oben.

folgende Sortierung mag zwar unicodemässig korrekt sein, aber jeder Kunde reisst mir den Kopf ab:

Institut anderer Sprachen
Institute belgischer Sprachen
Institut englischer Sprachen
Institut zur Erforschung von noch mehr Sprachen


Ich hab den Vorschlag von Lars mit Unicode::Collate mittels copy/paste probiert, aber erstens fkt. es bei mir ned (sortiert einfach gar ned sondern gibt die eingabereihenfolge aus) und zweitens löst das mein leerzeichenproblem auch nicht.

DANKE

lgp

----- Ursprüngliche Mail -----
> einzig, den space versteh ich auch nicht. ....
> 
> perl -CO llolo.pl
> 
> 
> 
> 
> 2010/11/9 Klaus Ita <klaus at worstofall.com>:
> > man, use utf8
> >
> > 2010/11/9 peter pilsl <pilsl at goldfisch.at>:
> >>
> >> hallo,
> >>
> >> tja ... irgendwie dachte ich dass diese Probleme jahrelang hinter
> >> mir liegen ... aber nun steh ich wieder dort:
> >>
> >> ich schaffs nicht, eine liste von wörtern lexigraphisch korrekt zu
> >> sortieren.
> >>
> >> ----------------------
> >> #!/usr/bin/perl -w
> >>
> >> use strict;
> >> use locale;
> >> use POSIX qw(locale_h);
> >> setlocale(LC_ALL, "de_AT.UTF-8");
> >>
> >> my @l;
> >> @l=qw(ampel ampele ösen zöse ampez ampex);
> >> push(@l,"ampel vorrang","öse nöse","Öse nöse","ampe wampe","
> >> sowas");
> >>
> >> @l=map {lc($_)} @l;
> >>
> >> @l=sort {$a cmp $b} @l;
> >>
> >> print join("\n", at l),"\n";
> >> --------------------------
> >>
> >>
> >> mein ergebnis:
> >>
> >> ampel
> >> ampele
> >> ampel vorrang
> >> ampe wampe
> >> ampex
> >> ampez
> >> ösen
> >> öse nöse
> >> Öse nöse
> >>  sowas
> >> zöse
> >>
> >> das ist offensichtlich falsch. Erstens wird das grosse "Ö" nicht
> >> kleingemacht und zweitens sollte das leerzeichen noch vor dem a
> >> kommen und nicht irgendwo zwischen l und x :)
> >>
> >> locales sind immer schwierig. Aber ich glaub ich hab alles richtig
> >> gemacht. die locales sind auf den test-systemen installiert (prüfen
> >> mit "locale -a", erzeugen mit locale-gen) und auch die
> >> environment-variablen LANG,LC_ALL,LC_COLLATE,LC_CTYPE sind richtig
> >> gesetzt obwohl das glaub ich ned nötig ist, weil ich eh die
> >> POSIX-locales im script nehm.
> >>
> >> getestet hab ich das auf insgesamt vier Rechnern. zwei mit perl
> >> 5.8.8 und zwei mit perl 5.10.1 (alles ubuntu: 8.04, 9.04, 10.04 u
> >> 10.10)
> >>
> >> ich hab auch alle möglichen utf8::encode und utf8::decode und das
> >> umwandeln auf latin1 vor dem sortieren und rückwandeln auf utf8
> >> nachher probiert. hat alles ned funktioniert.
> >>
> >> was überseh ich? kann das wer auf einem anderen system als ubuntu
> >> testen? danke & danke für tips,
> >> peter
> >>
> >>
> >>
> >> _______________________________________________
> >> Vienna-pm mailing list
> >> Vienna-pm at pm.org
> >> http://mail.pm.org/mailman/listinfo/vienna-pm
> >


More information about the Vienna-pm mailing list