[Vienna-pm] utf8 string als hash-key

max prozessor13 at gmx.net
Mon Sep 21 10:37:04 PDT 2009


> Du fummelst mit der internen Repräsentation von Strings herum.
> Das willst du in 99.9999% der Fälle *nicht* machen.

:) nein will ich nicht, werd jetzt alle meine _utf8_on/off sachen aus  
dem code raushaun

> Das willst du nicht. »ß« kann abhängig vom Flag wahlweise als
> Byte DF oder als Bytefolge C3 9F dargestellt und BEDEUTET
> DASSELBE in beiden Fällen. Du willst die Zeichenkette encoden,
> nicht einfach an irgendwelchen Perl-Eingeweiden herumfummeln,
> sodaß aus einem »ß« immer dasselbe Ergebnis wird, nicht mal so
> und mal so.

yep, will ich!

>> es kommen immer utf8-strings daher, darum auch diese annahme
>> (was jetzt programmiertechnisch sicher nicht 1A ist ;)
>
> Gewöhn dir das ab. Denk nicht über das UTF-8-Flag nach.
>
>> ja und nein, denn in perl5.8.9 funktioniert es ja. das ist ja
>> das komische!
>
> Das ist Programming by Coincidence. Wenn du es falsch machst, und
> es funktioniert zufälligerweise trotzdem, heißt das nicht, daß du
> es richtig gemacht hast.

ich will nochmal betonen, dass ich "nur" einen folgefehler gemacht  
hab. wenn das modul gleich richtig hinhaut, dann komm ich nicht in die  
versuchung so zu tricksen...
und dafuer hab ich jetzt ja euch gefragt, gelernt und alles richtig  
gemacht.

> Hier ist das Gegenbeweis-Skript:
>
>    use strict;
>    use utf8;
>    use Data::Dumper;
>    use Encode;
>    binmode STDOUT, ':encoding(UTF-8)';
>
>    sub x {
>      my %hash = map {
>         my $k = $_;
>         encode('UTF-8', $k) => 'bytes';
>      } @_;
>      foreach (keys %hash) {
>         my $k = $_;
>         $hash{decode('UTF-8', $k)} = 'utf8';
>      }
>      return \%hash;
>    }

genau dieses hat mir der Wolfgang Laun auch schon gesagt, und seit  
nachmittag funkt endlich alles. aber auch nochmal danke!

> Ein paar Punkte zum Mitschreiben:
>
> • Niemals den `:utf8` binmode verwenden, denn der macht effektiv
>  nur `_utf8_on`/`_utf8_off` statt den Input/Output tatsächlich
>  zu de-/enkodieren.
>
> • Aus `utf8` nur `upgrade`/`downgrade` verwenden, und dann auch
>  nur falls man mit kaputten XS-Modulen zu tun hat und die Daten
>  in Latin-1 passen.
>
> • Sonst IMMER `decode`/`encode` aus Encode nehmen.
>
> • Das Encoding immer »UTF-8« schreiben, nicht »utf8«; letzteres
>  prüft nur minimalst auf Gültigkeit. (Das kann bis hin zu
>  Sicherheitslücken führen, weil das Programm dann evlt. dazu zu
>  bringen ist, Output zu erzeugen, der von andere Programmen
>  falsch interpretiert wird.)
>
> • perlunitut und perlunifaq lesen.

NOTIERT! unicode ist echt kein leichtes thema.. nicht nur in perl,  
sondern ueberall.
ich hab ja seinerzeit gehofft (vor 10 jahren), dass mit dem  
endgueltigen durchbruch vom internet nur noch A-Za-z0-9 und ein paar  
sonderzeichen ueberleben. naja...

thx. u. auf bald. max.



More information about the Vienna-pm mailing list