Файл JSON в кодировке UTF-8, пытающийся проанализировать с помощью модуля JSON - широкий символ - PullRequest
0 голосов
/ 05 февраля 2019

У меня довольно простой скрипт на 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);
}

Файл закодирован в UTF-8 в Notepad ++:

enter image description here

... но когда я запускаю свой скрипт, я получаю:

perl test.cgi
Wide character in subroutine entry at test.cgi line 11.

Строка 11:

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

Я сбит с толку относительно того, что я делаю неправильно.Может быть, мне просто нужен перерыв!Любые советы будут высоко ценится!

1 Ответ

0 голосов
/ 05 февраля 2019

Вы пытаетесь выполнить двойное декодирование UTF-8:

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

use JSON;
use Data::Dumper;

open(my $fh,  '<:encoding(UTF-8)', $ARGV[0]) or die $!;
my @lines = <$fh>;
close($fh) or die $!;

# Wide character in subroutine entry at dummy.pl line 14.
my $ref = JSON->new->utf8->decode(join('', @lines));

# OK, no warning.
my $ref = JSON->new->decode(join('', @lines));

print Dumper($ref);

exit 0;

Тестовый прогон

$ cat dummy.json
{
   "path": "ä⁈"
}

# with ->utf8
$ perl dummy.pl dummy.json
Wide character in subroutine entry at dummy.pl line 14.

# without ->utf8
$ perl dummy.pl dummy.json
$VAR1 = {
          'path' => "\x{e4}\x{2048}"
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...