Я получаю сообщение об ошибке при выполнении следующего кода:

use JSON;
use Encode qw( encode decode encode_utf8 decode_utf8);
my $arr_features_json = '[{"family":"1","id":107000,"unit":"","parent_id":"0","cast":"2","search_values_range":"1,2,3,4,5,6,7,8,9,10,11,12","category_id":"29","type":"2","position":"3","name":"Número de habitaciones","code":"numberofrooms","locales":"4","flags":"1"}]';
$arr_features_json = decode_json( $arr_features_json );

Я получаю следующее сообщение об ошибке:

неверно сформированный символ UTF-8 в строке JSON со смещением символа 169 (до "\ x {fffd} de haza ...") в строке 13 test.pl

decode_json выдает ошибку из-за символа ú в json, поэтому я хочу преобразовать этот символ в \u00fa. Как я могу это сделать?

0
Ganesh 27 Апр 2016 в 16:04

2 ответа

Лучший ответ

В сообщении об ошибке указано, что строка, которую вы пытаетесь обработать, не является UTF-8 или неверная строка UTF-8. Итак, вам нужно преобразовать его в строку UTF-8 с помощью encode_utf8 перед декодированием в json.

use JSON;
use Data::Dumper;
use Encode qw( encode decode encode_utf8 decode_utf8);

my $arr_features_json = '[{"family":"1","id":107000,"unit":"","parent_id":"0","cast":"2","search_values_range":"1,2,3,4,5,6,7,8,9,10,11,12","category_id":"29","type":"2","position":"3","name":"Número de habitaciones","code":"numberofrooms","locales":"4","flags":"1"}]';
my $arr_features = decode_json( encode_utf8($arr_features_json) );

print Dumper($arr_features);

Возможно, вам стоит проверить это article, чтобы узнать разницу между строками UTF-8 и character strings.

1
Arunesh Singh 28 Апр 2016 в 05:31

decode_json ожидает UTF-8, но имеющаяся у вас строка не закодирована с использованием UTF-8. decode строка, если это еще не сделано, используйте from_json вместо decode_json.

#!/usr/bin/perl

use strict;
use warnings;
use feature qw( say );

use utf8;                             # Perl code is encoded using UTF-8.
use open ':std', ':encoding(UTF-8)';  # Terminal provides/expects UTF-8.

use JSON qw( from_json );

my $features_json = '
  [
    {
      "family": "1",
      "id": 107000,
      "unit": "",
      "parent_id": "0",
      "cast": "2",
      "search_values_range": "1,2,3,4,5,6,7,8,9,10,11,12",
      "category_id": "29",
      "type": "2",
      "position": "3",
      "name": "Número de habitaciones",
      "code": "numberofrooms",
      "locales": "4",
      "flags": "1"
    }
  ]
';

my $features = from_json( $features_json );

say $features->[0]{name};
2
ikegami 27 Апр 2016 в 13:49