سؤال

لقد واجهت مشكلة غريبة في UTF-8 مع Net::Cassandra::Easy (وهو مبني على Net::Cassandra): يتم تشويه سلاسل UTF-8 المكتوبة إلى كاساندرا عند الاسترجاع.

يعرض الرمز التالي المشكلة:

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";
}

عند تشغيل الرمز أعلاه $set_value eq $get_value يقيم false. ما الخطأ الذي افعله؟

هل كانت مفيدة؟

المحلول

يضيف 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 أن لديك سلسلة تحتوي على تسلسل Byte UTF-8 ، وأنه يجب تحويله إلى تمثيل بيرل الداخلي لليونيكود. كما يشير Jrockway ، يجب عليك أيضًا الاتصال Encode::encode_utf8 على أي سلاسل قبل إرسالها إلى كاساندرا ، على الرغم من أن بيرل يعرف بالفعل أنها UTF-8 ، على سبيل المثال إذا فتحت ملفًا مع ملف :utf8 طبقة ترميز.

إذا كنت تستخدم UTF-8 في كثير من الأحيان ، فقد ترغب في كتابة غلاف عبر Net :: Cassandra :: من السهل القيام بذلك تلقائيًا.

أخيرًا ، لا تحتاج use utf8; ما لم تكن بيرل الخاص بك مصدر الرمز (عامل أسماء, ، التعليقات وما إلى ذلك) يحتوي على أحرف UTF-8. يمكن لـ Perl التعامل مع UTF-8 سلاسل سواء كنت تحدد use utf8; أم لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top