如果这是一个非常愚蠢的问题,或者已经在其他地方问过了,我很抱歉。我正在读入一些JSON并对其使用decode_json,然后从中提取文本并将其输出到一个文件。
我的问题是,Unicode字符在JSON中编码为例如\u2019,decode_json似乎将其转换为\x{2019}。当我抓取这个文本并输出到一个UTF8编码的文件时,它显示为垃圾。
示例代码:
use warnings;
use strict;
use JSON qw( decode_json );
use Data::Dumper;
open IN, $file or die;
binmode IN, ":utf8";
my $data = <IN>;
my $json = decode_json( $data );
open OUT, ">$outfile" or die;
binmode OUT, ":utf8";
binmode STDOUT, ":utf8";
foreach my $textdat (@{ $json->{'results'} }) {
print STDOUT Dumper($textdat);
my $text = $textdat->{'text'};
print OUT "$text\n";
}Dumper输出显示\u编码已转换为\x编码。我做错了什么?
发布于 2018-11-12 23:57:46
unicode需要使用UTF-8编码的输入,因此请使用接受decode_json的from_json:
my $json = from_json($data);另一种选择是自己对数据进行编码:
use Encode;
my $encoded_data = encode('UTF-8', $data);
...
my $json = decode_json($data);但是仅仅为了解码而对数据进行编码是没有什么意义的。
发布于 2018-11-13 01:18:11
decode_json要求使用UTF8,但是您传递的是已解码的文本(Unicode代码点)。
因此,您可以删除现有的字符解码。
use feature qw( say );
use open 'std', ':encoding(UTF-8)';
use JSON qw( decode_json );
my $json_utf8 = do {
open(my $fh, '<:raw', $in_qfn)
or die("Can't open \"$in_qfn\": $!\n");
local $/;
<$fh>;
};
my $data = decode_json($json_utf8);
{
open(my $fh, '>', $out_qfn)
or die("Can't create \"$out_qfn\": $!\n");
for my $result (@{ $data->{results} }) {
say $fh $result->{text};
}
}或者,您可以使用from_json (或JSON->new->decode)代替decode_json。
use feature qw( say );
use open 'std', ':encoding(UTF-8)';
use JSON qw( from_json ); # <---
my $json_ucp = do {
open(my $fh, '<', $in_qfn) # <---
or die("Can't open \"$in_qfn\": $!\n");
local $/;
<$fh>;
};
my $data = from_json($json_ucp); # <---
{
open(my $fh, '>', $out_qfn)
or die("Can't create \"$out_qfn\": $!\n");
for my $result (@{ $data->{results} }) {
say $fh $result->{text};
}
}箭头指向两个代码段之间的三个微小差异。
我做了一些清理工作。
local $/;以防JSON中有换行符。$data和$json明显相反,$file不包含文件。:encoding(UTF-8) (标准编码)而不是:encoding(utf8) (仅由使用的编码)。:utf8更糟糕,因为它使用内部编码而不是标准编码,如果提供了错误的输入,它可能会导致标量损坏。
https://stackoverflow.com/questions/53265573
复制相似问题