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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top