Поддерживает ли модуль Perl Net :: Cassandra UTF-8? - PullRequest
1 голос
/ 27 марта 2010

Я столкнулся с действительно странной проблемой UTF-8 с Net::Cassandra::Easy (которая основана на Net::Cassandra): строки 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. Что я делаю не так?

1 Ответ

4 голосов
/ 27 марта 2010

Добавьте use Encode; в начало вашего скрипта и передайте переменные через Encode::decode_utf8. Например:

my $get_value = $result->{$key}->{"Standard1"}->{$column};
$get_value = Encode::decode_utf8($get_value);

Выходы:

OK: ☃ == ☃

Когда вы устанавливаете $set_value в "\ x {2603}", Perl обнаруживает широкий символ и устанавливает для вас кодировку строки UTF-8. Чтобы подтвердить это, выведите возвращаемое значение Encode::is_utf8($set_value).

К сожалению, как только эта строка попадает в Кассандру и возвращается обратно, информация о кодировке теряется. Похоже, что Кассандра не зависит от кодировки. Вызов Encode::decode_utf8 сообщает Perl, что у вас есть строка, содержащая последовательность байтов UTF-8, и что она должна быть преобразована во внутреннее представление Perl для Unicode. Как указывает jrockway, вы должны также вызывать Encode::encode_utf8 для любых строк перед их отправкой в ​​Cassandra, хотя в большинстве случаев Perl уже знает, что они UTF-8, например, если вы открыли файл с кодировкой :utf8 слой.

Если вы часто используете UTF-8, вы можете написать обертку через Net :: Cassandra :: Easy, чтобы сделать это автоматически.

Наконец, вам не нужно use utf8;, если ваш исходный код Perl (переменная имена , комментарии и т. Д.) Не содержит символов UTF-8. Perl может обрабатывать строки UTF-8 независимо от того, указали вы use utf8; или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...