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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top