Добавьте 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;
или нет.