Fa netto di Perl :: Cassandra supporto per i moduli UTF-8?
Domanda
ho incontrato un problema davvero strano UTF-8 con Net::Cassandra::Easy
(che è costruito su Net::Cassandra
):. Stringhe UTF-8 scritte a Cassandra sono confusi su di recupero
Il codice seguente mostra il 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";
}
Quando si esegue il codice sopra $set_value eq $get_value
restituisce false
. Che cosa sto facendo di sbagliato?
Soluzione
Aggiungi use Encode;
all'inizio del vostro script, e passare variabili attraverso Encode::decode_utf8
. Ad esempio:
my $get_value = $result->{$key}->{"Standard1"}->{$column};
$get_value = Encode::decode_utf8($get_value);
Uscite:
OK: ☃ == ☃
Quando si imposta $set_value
a "\ x {2603}", Perl rileva il carattere ampio e imposta la stringa di codifica UTF-8 per voi. A conferma di ciò, stampare il valore di ritorno di Encode::is_utf8($set_value)
.
Purtroppo, una volta che questa stringa va in Cassandra e poi di nuovo fuori, le informazioni di codifica è perduto. Sembra che Cassandra è codifica-agnostico. Chiamando Encode::decode_utf8
dice Perl che si dispone di una stringa che contiene una sequenza di byte UTF-8, e che dovrebbe essere convertito in rappresentazione interna del Perl per Unicode. Come jrockway sottolinea, si dovrebbe anche chiamare Encode::encode_utf8
su eventuali stringhe prima di essere inviati a Cassandra, anche se nella maggior parte dei casi Perl sa già che sono UTF-8, per esempio se hai aperto un file con lo strato di codifica :utf8
.
Se si utilizza UTF-8 spesso, si potrebbe desiderare di scrivere un involucro sopra Net :: :: Cassandra facile da fare questa operazione automaticamente.
Infine, non è necessario use utf8;
meno che i vostri Perl il codice sorgente (variabile nomi , commenti, ecc) contengono dei caratteri UTF-8. Perl in grado di gestire UTF-8 stringhe se si specifica use utf8;
o meno.