2011-04-04 102 views
2

在尝试解码来自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来解决此问题,但这需要安装额外的“编码器”模块,这是我想避免的。

+0

[编码](http://p3rl.org/Encode)模块自从v5.7.3开始提供Perl。 – daxim 2011-04-05 22:30:30

回答

4

尝试了你的代码,它产生了几个警告与“使用警告;”

如果你想确保获得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教程经常告诉你明确说明你想在你的输入上输入什么编码(文件处理程序)

+0

为我工作,谢谢 – braz 2011-04-05 11:47:33

+0

然而,奇怪的是,perl无法解码utf-8默认情况下的“\ u ...”字符 – braz 2011-04-05 11:48:50

+1

不,这不是.. 阅读http://joelonsoftware.com/文章/Unicode.html,然后http://perldoc.perl.org/perlunitut.html,然后查看http://perldoc.perl.org/perlunifaq.html – 2011-04-06 08:37:43