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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top