在尝试解码来自PHP脚本的json_encode
函数的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来解决问题,但这需要安装一个额外的“编码器”模块,我想避免这种情况。
答案 0 :(得分: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教程通常会告诉您在输入和输入上明确说明您想要的编码。输出(文件处理程序)