[Vienna-pm] utf8 string als hash-key

Josef e9427749 at stud4.tuwien.ac.at
Mon Sep 21 08:41:40 PDT 2009


Hi, again!

max schrieb:
[…]
>> Zu Deinem Ausgangspunkt noch ein paar Fragen.
>>
>> Was tut:
>> %hash=map { utf8::upgrade(my $k=$_); $k => $hash{$_} } keys %hash;
>> $rdb->mget(\%hash);               # Verliert utf8-Flag
>> %hash=map { _utf8_on(my $k=$_); $k => $hash{$_0} } keys %hash;
> 
> bleibt haengen... geiches passiert bei "normalen" utf8 strings 
> (wohlgemerkt nur unter perl5.10)

Bei welcher Zeile?
(Falls Deine Behauptung stimmt, das alle Texte utf-8 sind, kannst
  Du die erste Zeile auch auskommentieren.)

>> Und was tut:
>> %hash=map { encode('iso-8859-1',$_) => $hash{$_} } keys %hash;
>> # ^- nur Latin1, kein Flag
>> $rdb->mget(\%hash);
>> # solange nur latin1-Zeichen sollte es passen.
> 
> das klappt komischerweise. versteh ich ueberhaupt nicht! kann sogar mit 
> dem 6byte langam 'öäü' string den hash-accessen (wo ja eigentlich nur 
> 3byte keys drinnen sein sollten). oder macht hier perl dann automatisch 
> die konvertierung?? falls ja, dann kann das aber, wie du eh schon sagst 
> mit chinesischen zeichen nicht funken.
> 
>> Und drittens:
>>  Falls deine Lib reines Perl ist, schau ob dort irgendwo
>>  "use bytes;" steht und kommentier das mal testweise aus.
>>  Vielleicht erübrigt sich dann Dein Workaround, um den
>>  Workaround der Bibl. für ältere Perls.
> 
> das modul ist perl/xs, und das problem ist nicht in aelteren perls 
> sondern in perl5.10.

Abgesehen von perl5.10 Seltsamkeiten verwurschtelt dein Modul
definitiv das utf8-Flag. Also mal ein Fehler des Moduls!
Wenn es denn nicht gebe, wärst Du mit den perl5.10 Problemen
nicht in Kontakt gekommen.

Älterer xs-Code ist oft nicht utf8-aware.

> die use bytes directive ist fuer das ganze TokyoTyrant package 
> eingeschalten, und darin wird dann extrem viel mit pack, unpack usw 
> gemacht. das ist mir irgendwie zu heiss, da was anzufassen.

Na ja, man könnte auch innerhalb von mget "no bytes;" einfügen.
Aber das ist trotzdem Glückssache wegen xs.

# Oder im eigen Modul dies einfügen (untestet)
{ package TokyoTyrant; # oder wie auch immer es heißt.
   my $org_mget=\&TokyoTyrant::mget;
   no warnings 'redefine';
   sub mget : method { no bytes; shift()->$org_mget(@_) };
}

Oder es gibt ohnehin eine neuere Version dieses Moduls‽

ciao,
   Josef



>> PS: utf8::upgrade($_) for keys %hash;
>>    geht für values aber nicht für keys.
> 
> hmm. das versteh ich irgendwie nicht... was du da meinst?

Macht nix, war ohnehin an andere Mitleser adressiert…



More information about the Vienna-pm mailing list