在perl中解码unicode JSON时出现问题

在perl中解码unicode JSON时出现问题,perl,json,unicode,Perl,Json,Unicode,在尝试解码来自PHP脚本函数的Unicode JSON字符串时,我在Perl中遇到了一个奇怪的行为。我将问题简化为下一个代码: #!/usr/bin/perl use CGI; use JSON; print CGI::header(-type=>'text/html', -charset=>'UTF-8'); print %{ decode_json('{"test_1" : "= \u00F9 ="}') }->{'test_1'}; print '<br>'

在尝试解码来自PHP脚本函数的Unicode JSON字符串时,我在Perl中遇到了一个奇怪的行为。我将问题简化为下一个代码:

#!/usr/bin/perl
use CGI;
use JSON;
print CGI::header(-type=>'text/html', -charset=>'UTF-8');

print %{ decode_json('{"test_1" : "= \u00F9 ="}') }->{'test_1'};
print '<br>';
print %{ decode_json('{"test_2" : "= \u00F9 \u0121 ="}') }->{'test_2'};
第一行包含一个“断字符”,第二行是正确的。我认为发生的事情是,出于某种原因,Perl以ISO-8859-1编码对第一个字符串进行解码,如果我将页面编码更改为ISO-8859-1,则第一行是正确的,而第二行是断开的

我的Perl版本是5.10.1,JSON版本是2.51

问题:如何强制Perl
json_decode
在第一次打印时返回UTF-8字符


注意:我可以通过手动将第一个输出转换为UTF-8来解决这个问题,但这需要安装一个额外的“编码器”模块,我希望避免这种情况。

尝试了您的代码,它生成了几个带有“使用警告”的警告

如果您想确保获得utf8,我相信您必须告诉Perl。使用“binmode(标准输出“:utf8”);”或类似命令

这在命令行上起作用:

use strict;
use warnings;
use JSON;

binmode(STDOUT, ":utf8");

print decode_json('{"test_1" : "= \u00F9 ="}')->{test_1};
print '<br>';
print decode_json('{"test_2" : "= \u00F9 \u0121 ="}')->{'test_2'};
使用严格;
使用警告;
使用JSON;
binmode(标准输出,“:utf8”);
打印decode_json('{“test_1”:“=\u00F9=“}”)->{test_1};
打印“
”; 打印decode_json(“{”test_2“:“=\u00F9\u0121=“}”)->{test_2'};
编辑:
好的,这不会影响decode_json(),但会影响perl脚本本身的输出。Unicode教程通常会告诉您显式地说明在输入和输出(FileHandler)中需要什么编码

,但奇怪的是,perl无法通过默认值对utf-8中的“\u…”字符进行解码不,不是这样。。请阅读,然后从常见问题解答中查看:“Perl警告“Wide character in…”是由序号值大于255的字符引起的。在没有指定编码层的情况下,Perl出于向后兼容的原因尝试将内容放入ISO-8859-1中。如果不能,则会发出此警告(如果启用了警告),并输出UTF-8编码的数据。为了确保我正确理解了所有内容,我下面的解释是否正确:在示例的第一个字符串中,perl看到了可以在IS0-8859-1中转换的字符,所以它是这样做的,因为我的页面编码是UTF-8,所以字符看起来是断开的,当perl遇到第二个字符串时,它会看到无法转换为iso-8859-1的第二个字符\u0121,perl会删除一条警告,并将whoe字符串转换为UTF-8?该模块自v5.7.3开始随perl提供。
use strict;
use warnings;
use JSON;

binmode(STDOUT, ":utf8");

print decode_json('{"test_1" : "= \u00F9 ="}')->{test_1};
print '<br>';
print decode_json('{"test_2" : "= \u00F9 \u0121 ="}')->{'test_2'};