[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