Проблема с декодированием Unicode JSON в Perl - PullRequest
2 голосов
/ 04 апреля 2011

Я испытываю странное поведение в Perl при попытке декодирования строки JSON Unicode, поступающей из функции json_encode PHP-скрипта. Я упростил задачу до следующего кода:

#!/usr/bin/perl
use CGI;
use JSON;
print CGI::header(-type=>'text/html', -charset=>'UTF-8');

print %{ decode_json('{"test_1" : "= \u00F9 ="}') }->{'test_1'};
print '<br>';
print %{ decode_json('{"test_2" : "= \u00F9 \u0121 ="}') }->{'test_2'};

Когда я запускаю этот скрипт в браузере, я вижу следующее:

= � =
= ù ġ =

Первая строка содержит «ломаный символ», вторая - правильная. Я думаю, что происходит, что по какой-то причине Perl декодирует первую строку в кодировке ISO-8859-1, если я изменяю кодировку страницы на ISO-8859-1, первая строка верна, однако вторая не работает

Моя версия Perl - 5.10.1, а версия JSON - 2.51.

Вопрос: как заставить Perl json_decode вернуть символы UTF-8 в первом отпечатке?

Примечание: я могу исправить проблему, вручную преобразовав первый вывод в UTF-8, но для этого требуется установка дополнительного модуля «Кодировщик», которого я хочу избежать.

1 Ответ

4 голосов
/ 04 апреля 2011

Попробовал ваш код, и он выдал несколько предупреждений с "use warnings"

Если вы хотите быть уверены, что получите utf8, я думаю, вы должны сказать Perl об этом.Используйте "binmode (STDOUT,": utf8 ");"или аналогичный.

Это работает в командной строке:

use strict;
use warnings;
use JSON;

binmode(STDOUT, ":utf8");

print decode_json('{"test_1" : "= \u00F9 ="}')->{test_1};
print '<br>';
print decode_json('{"test_2" : "= \u00F9 \u0121 ="}')->{'test_2'};

EDIT: AFAIK, это не влияет на decode_json (), но выводит сам скрипт perl.В руководствах по Юникоду часто указывается, что нужно явно указать, какую кодировку вы хотите использовать для ввода и вывода (обработчики файлов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...