[Vienna-pm] utf8 string als hash-key

Josef e9427749 at stud4.tuwien.ac.at
Sun Sep 20 14:29:58 PDT 2009


Hallo, Max!

_utf8_{on,off} setzen nur das interne Flag um!
Und ändern nichts an den Daten.

Wenn Flag zuerst an, dann schaltest Du aus und wieder an,
geht alles _zufälligerweise_!
Wenn aber das Flag aus ist, weil nur Latin1 Zeichen drin;
Und Du schaltest aus (nop) un dann ein, dann hält er deinen
String (der immer noch iso-8859-1 ist, fälschlicherweise
für utf-8. Ausgeben tuts Du in utf-8, also meint er nichts
zu tun zu haben. => Problemo no uno.

Zweitens ist die Bytefolge \x{f6}\x{e4}\x{fc} Latin1 bzw.
utf8 nicht das selbe, somit findet er denn Wert korrekter-
weise nicht.

Wenn externes mit ausgemachten Hashkeys zugreift, brauchst
Du ohnehin encode("iso-8859-1",$s) & decode("iso-8859-1",$s).
(Sonst reicht u.U. ein use bytes an der richtigen Stelle.)

Die Doku vom Encode-Modul mag verwirrend sein, aber lesen
kann trotzdem nicht Schaden. Meist lohnender als per
zufallsmethode Funktionen einer Lib einzusetzen, und
hoffen das es tut was man will (trotz DWIMery ;-).

ciao,
   Josef

max schrieb:
> [...] sub x {
>   my %hash = map {
>      my $k = $_;
>      _utf8_off($k);    # so sollten dann doch einfach die bytes 
> verwendet werden
>      $k => 'ok';
>   } @_;
>   # hier braucht irgendeine logic einen hash mit keinen utf8-keys
>   # (es kommt sonnst in einer 3rd party lib zu einem fehler)
>   foreach (keys %hash) {
>      my $k = $_;
>      _utf8_on($k);    # und jetzt machen wir wieder utf8-strings daraus
>      $hash{$k} = delete $hash{$_};
>   }
>   # der return-hash soll wieder die originalen keys drinnen haben
>   return \%hash;
> }
> 
> package main;
> 
> use strict;
> use utf8;
> use Data::Dumper;
> binmode STDOUT, 'utf8';
> 
> my $x = 'öäü';
> my $h = X::x($x);
> print Dumper($h);
> print "\n\ntest: " . $h->{$x} . "\n";
> ----------------------------------------------------------
> 
> der output ist am test-system:
> 
>   $VAR1 = {
>          "\x{f6}\x{e4}\x{fc}" => 'ok'
>        };
> 
>   test: ok
> 
> und am live-system:
> 
>   $VAR1 = {
>          "\x{f6}\x{e4}\x{fc}" => 'ok',
>        };
> 
>   test:
> 
> jetzt gibt es fuer mich ein paar unbekannte:
> 
> * rechnet perl 5.10.0 richtig
> * rechnet perl 5.8.9 richtig
> * wieso schreibt Data::Dumper ueberhaupt \x{f6}\x{e4}\x{fc} und nicht 
> öäü ... \x{f6} ist doch ein latin1 zeichen??
> * wie kann ich das loesen


More information about the Vienna-pm mailing list