Perl JSON的utf8问题

之前使用JSON模块,一直被encode_json和to_json的编码问题搞晕。今天认真研究了下,感谢这篇雄文巨著《Perl Unicode全攻略》,算是有所收获。

首先终端环境(包括服务器的locale、桌面的SSH客户端、vim环境)的编码都设置为UTF-8。运行如下脚本:

use strict;
use JSON;
#use utf8;

my $val = "你好";
my $str = {key => $val};
my $js = to_json($str);
print $js;

不会报错,输出也正常。这里关掉了use utf8,即输入给to_json()是原始的二进制UTF-8串,没有转换成Perl内部格式。而这里如果打开use utf8,会有如下错误:

Wide character in print at utf8.pl line 8.

这个错误是因为在输出时,打开了utf8 flag的缘故。

再运行如下脚本:

use strict;
use JSON;
#use utf8;

my $val = "你好";
my $str = {key => $val};
my $js = encode_json($str);
print $js;

输出结果乱码。然后打开use utf8,再运行一遍,输出结果正常。

所以,上述说明:

  • encode_json()期待的是Perl内部的utf8串,除了字符是UTF-8编码外,utf8 flag也需打开
  • to_json()期待的是原始的UTF-8字符串,没有转换成Perl内部格式

反过来,decode_json()与from_json()的期待参数也是一样的。

此条目发表在Common分类目录,贴了标签。将固定链接加入收藏夹。