perl处理含有中文字符的json编码
例子:
1. 有php的 json函数生成的中文串
[root@tts177:/tmp]$/opt/php/bin/php -r 'echo json_encode(Array("a"=>"测试"))."\n";'
{"a":"\u6d4b\u8bd5"}
[root@tts177:/tmp]$
2. perl代码和执行结果如下:
[root@tts177:/tmp]$more uuu.pl
#!/usr/bin/perl
use warnings;
use Data::Dumper;
use JSON;
use Encode;
use URI::Escape;
my $str = '{"a":"\u6d4b\u8bd5"}'; ##就是上面的php字符串
my $p = decode_json($str);
print Dumper $p;
[root@tts177:/tmp]$
[root@tts177:/tmp]$./uuu.pl
$VAR1 = {
'a' => "\x{6d4b}\x{8bd5}" ##怪了吧,要是用php自带的json_decode($str,true)函数,解析出来的就是正常中文。
};
[root@tts177:/tmp]$
3. 解决方法,参考:
http://bbs.chinaunix.net/thread-1340623-1-1.html 6楼的帖子
4. 如下代码是解决方法
[root@tts177:/tmp]$more uuu.pl
#!/usr/bin/perl
use warnings;
use Data::Dumper;
use JSON;
use Encode;
use URI::Escape; ##正如帖子所说,不能用"use utf8"
my $str = '{"a":"\u6d4b\u8bd5"}';
my $p = decode_json($str);
my $s = $p->{'a'};
print $s,"\n"; ##第一个打印会打印出"Wide character in print at ./uuu.pl line 12." ,而且有时候还是乱码!
utf8::encode($s); ##这里要非常注意,此函数返回值为0。如果写成 $s = utf::encode($s); 就错了!
print $s,"\n";
[root@tts177:/tmp]$
[root@tts177:/tmp]$./uuu.pl
Wide character in print at ./uuu.pl line 12.
测试
测试
[root@tts177:/tmp]$
[root@tts177:/tmp]$more uuu.pl
#!/usr/bin/perl
use warnings;
use Data::Dumper;
#use URI::Escape;
my $unicode = "\x{505c}\x{8f66}";
utf8::encode( $unicode );
print $unicode;
[root@tts177:/tmp]$
[root@tts177:/tmp]$./uuu.pl
停车[root@tts177:/tmp]$