Does Perl Net :: Cassandra Modul Unterstützung von UTF-8?
Frage
Ich habe laufen in ein wirklich seltsames UTF-8 Problem mit Net::Cassandra::Easy
(die bei Net::Cassandra
gebaut wird.): UTF-8-Strings Cassandra geschrieben werden auf Abruf verstümmelt
Der folgende Code zeigt das Problem:
use strict;
use utf8;
use warnings;
use Net::Cassandra::Easy;
binmode(STDOUT, ":utf8");
my $key = "some_key";
my $column = "some_column";
my $set_value = "\x{2603}"; # U+2603 is ☃ (SNOWMAN)
my $cassandra = Net::Cassandra::Easy->new(keyspace => "Keyspace1", server => "localhost");
$cassandra->connect();
$cassandra->mutate([$key], family => "Standard1", insertions => { $column => $set_value });
my $result = $cassandra->get([$key], family => "Standard1", standard => 1);
my $get_value = $result->{$key}->{"Standard1"}->{$column};
if ($set_value eq $get_value) {
# this is the path I want.
print "OK: $set_value == $get_value\n";
} else {
# this is the path I get.
print "ERR: $set_value != $get_value\n";
}
Wenn Sie den Code oben $set_value eq $get_value
auswertet zu false
läuft. Was mache ich falsch?
Lösung
In use Encode;
zu Beginn des Skripts und Variablen durch Encode::decode_utf8
passieren. Zum Beispiel:
my $get_value = $result->{$key}->{"Standard1"}->{$column};
$get_value = Encode::decode_utf8($get_value);
Ausgänge:
OK: ☃ == ☃
Wenn Sie $set_value
auf "\ x {2603}", erkennt Perl die großen Zeichen und setzt die String-Codierung auf UTF-8 für Sie. Um dies zu bestätigen, den Rückgabewert von Encode::is_utf8($set_value)
drucken.
Leider, sobald diese Zeichenfolge in Cassandra geht und wieder heraus, wird die Codierung Informationen verloren. Es scheint, dass Cassandra Codierung unabhängig ist. Encode::decode_utf8
Aufruf sagt Perl, dass Sie eine Zeichenfolge eine UTF-8-Byte-Sequenz enthält, und dass es in Perl interne Darstellung für Unicode konvertiert werden soll. Als jrockway weist darauf hin, Sie auch Encode::encode_utf8
auf allen Saiten nennen sollten, bevor sie an Cassandra geschickt werden, obwohl in den meisten Fällen bereits Perl kennt sie sind UTF-8, zum Beispiel, wenn Sie eine Datei mit der :utf8
kodiert Schicht geöffnet haben.
Wenn Sie UTF-8 verwenden oft, Sie könnten einen Wrapper über Net :: Cassandra :: Einfach schreiben wollen dies automatisch zu tun.
Schließlich brauchen Sie nicht use utf8;
, wenn Ihr Perl Quellcode (Variable Namen , Kommentare etc.) enthält UTF-8-Zeichen. Perl kann UTF-8 behandeln Strings , ob Sie use utf8;
angeben oder nicht.