我有一个非常简单的 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)
我对自己做错了什么感到困惑。也许我只是需要休息一下!任何建议将不胜感激!
您正在尝试双重解码 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;\nRun 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 };\nRun Code Online (Sandbox Code Playgroud)\n