【问题标题】:perl: convert a string to utf-8 for json decodeperl:将字符串转换为 utf-8 以进行 json 解码
【发布时间】:2012-05-29 07:32:03
【问题描述】:

我正在抓取一个网站并从其 JSON 中收集信息。结果保存在哈希中。但是有些页面给了我“JSON 字符串中格式错误的 UTF-8 字符”错误。我注意到“cafe”中的最后一个字母会产生错误。我认为这是因为字符类型的混合。所以现在我正在寻找一种将所有类型的字符转换为 utf-8 的方法(希望有一种完美的方法)。我尝试了 utf8::all,它只是不起作用(也许我没有做对)。我是菜鸟。请帮忙,谢谢。


更新

好吧,在我阅读了 brian d foy 发布的文章“Know the difference between character strings and UTF-8 strings”之后。我用代码解决了问题:

use utf8;
use Encode qw(encode_utf8);
use JSON;


my $json_data = qq( { "cat" : "Büster" } );
$json_data = encode_utf8( $json_data );

my $perl_hash = decode_json( $json_data );

希望这对其他人有所帮助。

【问题讨论】:

  • 另外,您可能会查看您的网络用户代理正在做什么,并告诉它不要解码正文。这应该为您提供原始八位位组,因此您不必对解码的内容进行编码。

标签: json perl utf-8


【解决方案1】:

decode_json 期望 JSON 已使用 UTF-8 编码。

虽然您的源文件是使用 UTF-8 编码的,但您让 Perl 使用 use utf8; 对其进行解码(您应该这样做)。这意味着您的字符串包含 Unicode 字符,而不是代表这些字符的 UTF-8 字节。

正如您所展示的,您可以在将字符串传递给decode_json 之前对其进行编码。

use utf8;
use Encode qw( encode_utf8 );
use JSON   qw( decode_json );

my $data_json = qq( { "cat" : "Büster" } );
my $data = JSON->new->utf8(1)->decode(encode_utf8($data_json));
   -or-
my $data = JSON->new->utf8->decode(encode_utf8($data_json));
   -or-
my $data = decode_json(encode_utf8($data_json));

但您可以简单地告诉 JSON 字符串已经解码。

use utf8;
use JSON qw( from_json );

my $data_json = qq( { "cat" : "Büster" } );
my $data = JSON->new->utf8(0)->decode($data_json);
   -or-
my $data = JSON->new->decode($data_json);
   -or-
my $data = from_json($data_json);

【讨论】:

  • "但是你可以简单地告诉 JSON 字符串已经被解码。"你的意思是decode函数的输入已经编码成utf-8了吗?
  • 这个问题毫无意义。没有“是”,只有“必须”。 $json->decode 的输入必须是 UTF-8 编码还是不能编码取决于您使用的是JSON->new->utf8(1)->decode(又名decode_json)(输入必须是UTF-8)还是JSON->new->utf8(0)->decode(输入必须是Unicode字符)。
猜你喜欢
  • 2015-04-29
  • 2019-09-15
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2015-06-05
  • 2020-11-29
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多