質問

私は(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_valuefalseを評価する上記のコードを実行する場合。何が間違っているのでしょうか?

役に立ちましたか?

解決

あなたのスクリプトの先頭に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エンコード層でファイルを開いた場合。

あなたは、多くの場合、UTF-8を使用する場合は、

は、あなたがこれを自動的に行うためにはNet ::カサンドラ::簡単にオーバーラッパーを記述することがあります。

最後に、あなたはの(変数の名の、コメントなど)あなたのPerl のソースコードがない限りuse utf8;を必要としませんがUTF-8文字が含まれています。 Perlはuse utf8;を指定するかどうか、の文字列のUTF-8を扱うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top