UTF-8编码的JSON文件,尝试使用JSON模块解析 - 宽字符

And*_*wby 5 perl utf-8

我有一个非常简单的 Perl 脚本:

use JSON;

use open qw/ :std :encoding(utf8) /;

#my $ref = JSON::decode_json($json_contents);

my $path = "/home/chambres/web/x.org/public_html/cgi-bin/links/admin/booking_import/import/file.json";

my $json_contents = slurp_utf8_file($path);

my $ref =  JSON->new->utf8->decode($json_contents);

sub slurp_utf8_file {

  my @back;
  #open my $in,  '<:encoding(UTF-8)',  $_[0]  or die $!;
  open my $in,  "<$_[0]" or die $!;
    while (<$in>) {
      push @back, $_
    }
  close ($in);

  return join("", @back);
}
Run Code Online (Sandbox Code Playgroud)

该文件在 Notepad++ 中以 UTF-8 编码:

在此输入图像描述

...但是当我运行脚本时我得到:

perl test.cgi
Wide character in subroutine entry at test.cgi line 11.
Run Code Online (Sandbox Code Playgroud)

11号线是:

my $ref =  JSON->new->utf8->decode($json_contents);
Run Code Online (Sandbox Code Playgroud)

我对自己做错了什么感到困惑。也许我只是需要休息一下!任何建议将不胜感激!

Ste*_*ker 5

您正在尝试双重解码 UTF-8:

\n\n
#!/usr/bin/perl\nuse strict;\nuse warnings;\n\nuse JSON;\nuse Data::Dumper;\n\nopen(my $fh,  \'<:encoding(UTF-8)\', $ARGV[0]) or die $!;\nmy @lines = <$fh>;\nclose($fh) or die $!;\n\n# Wide character in subroutine entry at dummy.pl line 14.\nmy $ref = JSON->new->utf8->decode(join(\'\', @lines));\n\n# OK, no warning.\nmy $ref = JSON->new->decode(join(\'\', @lines));\n\nprint Dumper($ref);\n\nexit 0;\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试运行

\n\n
$ cat dummy.json\n{\n   "path": "\xc3\xa4\xe2\x81\x88"\n}\n\n# with ->utf8\n$ perl dummy.pl dummy.json\nWide character in subroutine entry at dummy.pl line 14.\n\n# without ->utf8\n$ perl dummy.pl dummy.json\n$VAR1 = {\n          \'path\' => "\\x{e4}\\x{2048}"\n        };\n
Run Code Online (Sandbox Code Playgroud)\n

  • @AndrewNewby 建议使用 [File::Slurper](https://metacpan.org/pod/File::Slurper) 代替,它具有更简单的功能。由此,您可以使用 read_binary 按原样读取字节,然后使用标准 UTF-8 解码 json 解码器。 (3认同)