soporte de módulo Net :: Cassandra UTF-8 de ciervas Perl?
Pregunta
Me he encontrado una muy extraña UTF-8 problema Net::Cassandra::Easy
(que se basa en Net::Cassandra
.): UTF-8 cuerdas escritas a Cassandra son ilegibles sobre la recuperación
El código siguiente muestra el problema:
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";
}
Cuando se ejecuta el código anterior evalúa $set_value eq $get_value
a false
. ¿Qué estoy haciendo mal?
Solución
Agregar use Encode;
al comienzo de su script, y pasar variables a través Encode::decode_utf8
. Por ejemplo:
my $get_value = $result->{$key}->{"Standard1"}->{$column};
$get_value = Encode::decode_utf8($get_value);
Salidas:
OK: ☃ == ☃
Cuando se establece $set_value
a "\ x {2603}", Perl detecta el carácter ancho y se pone la serie de codificación UTF-8 para usted. Para confirmar esto, imprima el valor de retorno de Encode::is_utf8($set_value)
.
Por desgracia, una vez que esta cadena entra en Cassandra y de vuelta otra vez, se pierde la información de codificación. Parece que Cassandra es la codificación agnóstica. Llamando Encode::decode_utf8
dice Perl que tiene una cadena que contiene una secuencia de bytes UTF-8, y que debe ser convertida en una representación interna de Perl para Unicode. Como puntos jrockway fuera, también deben llamar Encode::encode_utf8
en cualquier cadena antes de ser enviados a Cassandra, aunque en la mayoría de los casos Perl ya se sabe que son UTF-8, por ejemplo, si usted ha abierto un archivo con la capa de codificación :utf8
.
Si utiliza UTF-8 a menudo, es posible que desee escribir un envoltorio sobre Net :: :: Cassandra fácil de hacer esto de forma automática.
Por último, no es necesario a menos que su use utf8;
Perl código fuente (variable nombres , comentarios, etc.) contiene caracteres UTF-8. Perl puede manejar UTF-8 cadenas si se especifica use utf8;
o no.