[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