[Vienna-pm] utf8 string als hash-key

max prozessor13 at gmx.net
Mon Sep 21 01:33:30 PDT 2009


On Sep 20, 2009, at 11:29 PM, Josef wrote:

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

ja das weiss ich, das war auch genau meine absicht. ich wollt einfach  
den strings als bytes ansehen, ohne der utf8-logik

> 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.

es kommen immer utf8-strings daher, darum auch diese annahme (was  
jetzt programmiertechnisch sicher nicht 1A ist ;)

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

ja und nein, denn in perl5.8.9 funktioniert es ja. das ist ja das  
komische!

> 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.)

ja waere besser gewesen. hab halt gedacht, ich kann perl mit dem utf8  
flag austricksen... falsch gedacht

> 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 ;-).

was ist DWIMery? :)

das Encode-Modul hab ich schon gelesen -> es was schon volle absicht  
_utf8_off/on einzusetzen. also fuer mich war der code ja auch mehr als  
komisch programmiert, vorallem weil ich, wie ich jetzt weiss einen  
folgefehler zum ausbessern versucht hab.

vergessen wirs.. hab den code schon geloescht.

ich dank euch fuer die hilfe, denn oft ist einfach nur ein wenig  
beistand schon des problems loesung.

max.

>
> 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