2013-02-20 4 views
8
$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арабские символы в формате JSON декодирования

Вы можете видеть на Youtube, что арабские символы отображаются правильно. Что может быть моей ошибкой?

СОВЕТ: Я работаю над API <, этот пример предназначен только для разъяснения.

+3

вы можете показать арабские символы без использования json_encode, так почему же вы хотите попробовать json_encode эти символы? – haitaka

+0

Использовать инструменты ввода Google для арабского текста –

+0

Я работаю над API, поэтому я пытаюсь использовать json_encode –

ответ

20

"\u0628\u0633\u0645 \u0627\u0644\u0644\u0647" и "بسم الله" эквивалентны в JSON.

PHP просто по умолчанию использует Unicode escapes вместо литералов для многобайтовых символов.

Вы можете указать иначе: JSON_UNESCAPED_UNICODE (при условии, что вы используете PHP 5.4 или новее).

json_encode('بسم الله', JSON_UNESCAPED_UNICODE); 
+1

Работает нормально. –

+0

Мой хост еще не поддерживает PHP 5.4! Спасибо в любом случае :) –

+0

Фантастический! это сработало. –

2

Это правильная кодировка JSON строки UTF-8. Нет необходимости изменять его, он представляет собой правильную строку. Символы в JSON могут быть экранированы таким образом.

JSON может представляет символы UTF-8, если вы хотите. Начиная с PHP 5.4 у вас есть возможность установить флаг JSON_UNESCAPED_UNICODE для получения сырья UTF-8 строк:

json_encode($string, JSON_UNESCAPED_UNICODE) 

Но это лишь предпочтение, это не является необходимым.

2

Оба формата являются действительными и эквивалентные JSON строки:

char 
    any-Unicode-character- 
     except-"-or-\-or- 
     control-character 
    \" 
    \\ 
    \/ 
    \b 
    \f 
    \n 
    \r 
    \t 
    \u four-hex-digits 

Если вы предпочитаете Unencoded версию, просто добавьте JSON_UNESCAPED_UNICODE флаг:

<?php 

$test = json_encode('بسم الله', JSON_UNESCAPED_UNICODE); 
echo $test; 

Этот флаг требует PHP/5.4 .0 или больше.

2

Ну, как уже упоминалось ранее, это не имеет значения, поскольку обе строки эквивалентны. Что вам ДОЛЖНО делать, однако, убедитесь, что закодированная строка декодируется до того, как она будет отправлена ​​на выход.

echo json_decode($test); 

Или потому, что JSON содержат, скорее всего, больше, чем просто одну строку:

$obj['arabic'] = 'بسم الله'; 
$obj['latin'] = 'abcdef'; 
$obj['integer'] = 12345; 

$test = json_encode($obj); 

$testobject = json_decode($test); 
echo $testobject['arabic'];