perl:将字符串转换为utf-8以进行json解码

Iva*_*ang 6 perl json decode utf-8

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


UPDATA

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

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 );
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人.

ike*_*ami 20

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 = decode_json(encode_utf8($data_json));
Run Code Online (Sandbox Code Playgroud)

但你可以简单地告诉JSON该字符串已被解码.

use utf8;
use JSON qw( );

my $data_json = qq( { "cat" : "Büster" } );
my $data = JSON->new->utf8(0)->decode($data_json);
Run Code Online (Sandbox Code Playgroud)

  • 这个问题毫无意义.没有"是",只有"必须".`$ json-> decode`的输入是否必须是UTF-8编码或者不能编码取决于你是否使用`JSON-> new-> utf8(1) - > decode`(又名`decode_json`)(输入必须是UTF-8)或`JSON-> new-> utf8(0) - > decode`(输入必须是Unicode字符). (2认同)