在perl中解码unicode JSON的问题
问题描述:
在尝试解码来自PHP脚本的json_encode
函数的Unicode JSON字符串时,我在Perl中遇到了奇怪的行为。我简化了问题下面的代码:在perl中解码unicode JSON的问题
#!/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(STDOUT,”: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'};
编辑: AFAIK,这并不影响decode_json(),但是从Perl脚本本身的输出。 Unicode教程经常告诉你明确说明你想在你的输入上输入什么编码(文件处理程序)
[编码](http://p3rl.org/Encode)模块自从v5.7.3开始提供Perl。 – daxim 2011-04-05 22:30:30