[Vienna-pm] utf8 string als hash-key

max prozessor13 at gmx.net
Mon Sep 21 07:46:21 PDT 2009


hallo

> max schrieb:
>> keine schleche idee!, aber Wolfgang Laun hat mir grad eben schon  
>> den entscheidenden tip gegeben. naemlich
>
> Nun ja, da hättest Du auch mein Posting lesen können. ;-/
> (Latin1 wäre wichtig gewesen, wenn die andere Lib selber auf Werte
> mit bestimmten Schlüsseln zugreift. Diesbezügl. hattest Du Dich
> noch nicht geäußert gehabt. UTF-8 hat den Vorteil das alle Zeichen
> drin Platz haben.)

das stimmt schon, aber ich habs zu dem zeitpunkt noch nicht einsehen  
wollen, dass es nicht anders geht. vorallem hab ich gedacht mit latin1  
verliere ich im schlechtesten fall informationen, und mit base64 waere  
das nicht der fall, darum spontan die bessere alternative fuer mich.

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

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

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.

> Noch ein paar Fragen:
> - Taintmode?

nein

> - PERL_UNICODE Umgebungsvariable?

nein

> - Insbesondere Unterschiede zw. den Systemen?

ich denke nicht, os x und debian halt, und perl5.8.9 und perl5.10.0.  
alles mit den defaultconfigs installiert

danke wiedermal.
max.

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



More information about the Vienna-pm mailing list