gpt4 book ai didi

json - Perl 的 JSON::XS 未正确编码 UTF8?

转载 作者:行者123 更新时间:2023-12-02 01:14:41 30 4
gpt4 key购买 nike

这个简单的代码段显示了我在 Perl 中使用 JSON::XS 编码时遇到的问题:

#!/usr/bin/perl
use strict;
use warnings;
use JSON::XS;
use utf8;
binmode STDOUT, ":encoding(utf8)";

my (%data);

$data{code} = "Gewürztraminer";
print "data{code} = " . $data{code} . "\n";

my $json_text = encode_json \%data;
print $json_text . "\n";

产生的输出是:

johnnyb@boogie:~/Projects/repos > ./jsontest.pl 
data{code} = Gewürztraminer
{"code":"Gewürztraminer"}

现在,如果我注释掉上面的 binmode 行,我会得到:

johnnyb@boogie:~/Projects/repos > ./jsontest.pl 
data{code} = Gew�rztraminer
{"code":"Gewürztraminer"}

这里发生了什么?请注意,我试图在无法使用 binmode 的 perl CGI 脚本中修复此行为,但我总是在 JSON 流中返回如上所述的“Ë”字符。我该如何调试这个?我缺少什么?

最佳答案

encode_json (JSON::XS->new->utf8->encode 的缩写)使用 UTF-8 进行编码,然后您通过打印对其进行重新编码它到您已添加编码层的 STDOUT。实际上,您正在执行 encode_utf8(encode_utf8($uncoded_json))

解决方案1

use open ':std', ':encoding(utf8)';  # Defaults
binmode STDOUT; # Override defaults
print encode_json(\%data);

解决方案2

use open ':std', ':encoding(utf8)';    # Defaults
print JSON::XS->new->encode(\%data); # Or to_json from JSON.pm

解决方案3

以下内容通过对非 ASCII 使用 \u 转义来处理 STDOUT 上的任何编码:

print JSON::XS->new->ascii->encode(\%data);
<小时/>

在评论中,您提到它实际上是一个 CGI 脚本。

#!/usr/bin/perl
use strict;
use warnings;

use utf8; # Encoding of source code.
use open ':encoding(UTF-8)'; # Default encoding of file handles.
BEGIN {
binmode STDIN; # Usually does nothing on non-Windows.
binmode STDOUT; # Usually does nothing on non-Windows.
binmode STDERR, ':encoding(UTF-8)'; # For text sent to the log file.
}

use CGI qw( -utf8 );
use JSON::XS qw( );

{
my $cgi = CGI->new();
my $data = { code => "Gewürztraminer" };
print $cgi->header('application/json');
print encode_json($data);
}

关于json - Perl 的 JSON::XS 未正确编码 UTF8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170479/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com