首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自JSON问题的Perl编码

来自JSON问题的Perl编码
EN

Stack Overflow用户
提问于 2018-11-12 23:46:19
回答 2查看 139关注 0票数 0

如果这是一个非常愚蠢的问题,或者已经在其他地方问过了,我很抱歉。我正在读入一些JSON并对其使用decode_json,然后从中提取文本并将其输出到一个文件。

我的问题是,Unicode字符在JSON中编码为例如\u2019,decode_json似乎将其转换为\x{2019}。当我抓取这个文本并输出到一个UTF8编码的文件时,它显示为垃圾。

示例代码:

代码语言:javascript
复制
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编码。我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-11-12 23:57:46

unicode需要使用UTF-8编码的输入,因此请使用接受decode_jsonfrom_json

代码语言:javascript
复制
my $json = from_json($data);

另一种选择是自己对数据进行编码:

代码语言:javascript
复制
use Encode;

my $encoded_data = encode('UTF-8', $data);
...
my $json = decode_json($data);

但是仅仅为了解码而对数据进行编码是没有什么意义的。

票数 2
EN

Stack Overflow用户

发布于 2018-11-13 01:18:11

decode_json要求使用UTF8,但是您传递的是已解码的文本(Unicode代码点)。

因此,您可以删除现有的字符解码。

代码语言:javascript
复制
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

代码语言:javascript
复制
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中有换行符。
  • 不要使用2-arg JSON不必要的使用全局variables.
  • Use变量更好的名称。$data$json明显相反,$file不包含文件。
  • 限制了变量的作用域,特别是当它们耗尽系统资源时(例如,文件handles).
  • Use :encoding(UTF-8) (标准编码)而不是:encoding(utf8) (仅由

使用的编码)。:utf8更糟糕,因为它使用内部编码而不是标准编码,如果提供了错误的输入,它可能会导致标量损坏。

  • 去掉了用作散列键的标识符周围的嘈杂引号。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53265573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档