8

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


更新

好吧,在我阅读了由 brian d foy 发布的文章“知道字符串和 UTF-8 字符串之间的区别”之后。我用代码解决了这个问题:

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 );

希望这对其他人有帮助。

4

1 回答 1

24

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);
于 2012-05-22T21:29:13.257 回答