$test = json_encode('بسم الله'); echo $test;
В результате этого кода вывод: "\u0628\u0633\u0645 \u0627\u0644\u0644\u0647"
то время как это должно быть что-то вроде "بسم الله". Арабские символы кодируются при кодировании JSON, а в Youtube API это не так: http://gdata.youtube.com/feeds/api/videos/RqMxTnTZeNE?v=2&alt=json
Вы можете видеть на Youtube, что арабские символы отображаются правильно. Что может быть моей ошибкой?
СОВЕТ: Я работаю над API <пример только ради разъяснения.
"\u0628\u0633\u0645 \u0627\u0644\u0644\u0647"
и "بسم الله"
эквивалентны в JSON.
PHP просто по умолчанию использует Unicode escapes вместо литералов для многобайтовых символов.
Вы можете указать иначе с помощью JSON_UNESCAPED_UNICODE (при условии, что вы используете PHP 5.4 или новее).
json_encode('بسم الله', JSON_UNESCAPED_UNICODE);
Это правильная JSON-кодированная версия строки UTF-8. Нет необходимости изменять его, он представляет собой правильную строку. Символы в JSON могут быть экранированы таким образом.
JSON может представлять символы UTF-8 напрямую, если вы хотите. Начиная с PHP 5.4 вы можете установить флаг JSON_UNESCAPED_UNICODE
для создания необработанных строк UTF-8:
json_encode($string, JSON_UNESCAPED_UNICODE)
Но это только предпочтение, это не обязательно.
Оба формата являются действительными и эквивалентными строками JSON :
char any-Unicode-character- except-"-or-\-or- control-character \" \\ \/ \b \f \n \r \t \u four-hex-digits
Если вы предпочитаете незашифрованную версию, просто добавьте флаг JSON_UNESCAPED_UNICODE
:
<?php $test = json_encode('بسم الله', JSON_UNESCAPED_UNICODE); echo $test;
Для этого флага требуется PHP / 5.4.0 или выше.
Ну, как уже упоминалось ранее, это не имеет значения, поскольку обе строки эквивалентны. Однако вам следует сделать так, чтобы закодированная строка была декодирована до отправки на выход.
echo json_decode($test);
Или потому, что JSON содержит скорее всего более чем одну строку:
$obj['arabic'] = 'بسم الله'; $obj['latin'] = 'abcdef'; $obj['integer'] = 12345; $test = json_encode($obj); $testobject = json_decode($test); echo $testobject['arabic'];