【问题标题】:Does Perl's Net::Cassandra module support UTF-8?Perl 的 Net::Cassandra 模块是否支持 UTF-8?
【发布时间】:2011-02-01 10:19:46
【问题描述】:

Net::Cassandra::Easy(基于 Net::Cassandra)遇到了一个非常奇怪的 UTF-8 问题:写入 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。我做错了什么?

【问题讨论】:

  • 阅读后可能需要一个Encode::decode_utf8。 (实际上,一个 Encode::encode_utf8 用于写入。)

标签: perl unicode utf-8 nosql cassandra


【解决方案1】:

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) 的返回值。

不幸的是,一旦这个字符串进入 Cassandra 并再次退出,编码信息就会丢失。 Cassandra 似乎与编码无关。调用Encode::decode_utf8 告诉Perl 你有一个包含UTF-8 字节序列的字符串,并且它应该被转换成Perl 的Unicode 内部表示。正如 jrockway 指出的那样,在将任何字符串发送到 Cassandra 之前,您还应该在任何字符串上调用 Encode::encode_utf8,尽管在大多数情况下 Perl 已经知道它们是 UTF-8,例如,如果您使用 :utf8 编码打开了一个文件层。

如果您经常使用 UTF-8,您可能需要在 Net::Cassandra::Easy 上编写一个包装器来自动执行此操作。

最后,您不需要use utf8;,除非您的 Perl 源代码(变量名称、cmets 等)包含 UTF-8 字符。无论您是否指定use utf8;,Perl 都可以处理 UTF-8 字符串

【讨论】:

  • 感谢您的回答,但恐怕这并不能解决问题,因为 \u{2603} 是“☃”而不是“â”。因此,我期望的输出是“OK: ☃ == ☃”而不是“OK: â == â”。
  • 糟糕,使用 PuTTY 并忘记设置 UTF-8 字符集。我会回复你的。
  • 使用 UTF-8 时,上面的代码显示“OK: ☃ == ☃”。答案已更新。
  • 啊,太好了!那成功了!非常感谢您的回答!
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2012-01-10
相关资源
最近更新 更多