DOESのPerlのNet ::カサンドラモジュール支持UTF-8?
質問
私は(Net::Cassandra::Easy
に基づいて構築された)Net::Cassandra
と、本当に奇妙なUTF-8の問題に遭遇しました:カサンドラに書き込まれたUTF-8文字列は検索時に文字化けしている。
次のコードを示し問題:
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";
}
$set_value eq $get_value
にfalse
を評価する上記のコードを実行する場合。何が間違っているのでしょうか?
解決
あなたのスクリプトの先頭にuse Encode;
を追加し、Encode::decode_utf8
を通じて変数を渡します。たとえばます:
my $get_value = $result->{$key}->{"Standard1"}->{$column};
$get_value = Encode::decode_utf8($get_value);
を出力します:
OK: ☃ == ☃
「\ X {2603}」へのあなたのセット$set_value
、Perlはワイド文字を検出し、あなたのためのUTF-8にエンコードする文字列を設定します。このことを確認するために、Encode::is_utf8($set_value)
の戻り値を印刷します。
残念ながら、エンコーディング情報は失われます。カサンドラは、エンコーディングに依存しないようです。 Encode::decode_utf8
を呼び出すと、あなたはUTF-8バイトのシーケンスを含む文字列を持っている、そしてそれは、UnicodeのためのPerlの内部表現に変換する必要があることをことのPerl伝えます。彼らはカサンドラに送信される前に、ほとんどの場合、Perlはすでに彼らはUTF-8です知っているが、jrockwayポイントアウトは、あなたはまた、任意の文字列にEncode::encode_utf8
を呼び出す必要がありますとしては、例えば、あなたは:utf8
エンコード層でファイルを開いた場合。
は、あなたがこれを自動的に行うためにはNet ::カサンドラ::簡単にオーバーラッパーを記述することがあります。
最後に、あなたはの(変数の名の、コメントなど)あなたのPerl のソースコードがない限りuse utf8;
を必要としませんがUTF-8文字が含まれています。 Perlはuse utf8;
を指定するかどうか、の文字列のUTF-8を扱うことができます。