Как кодировать массив json с французскими акцентами?
У меня есть элемент массива с французским акцентом ([Описание]=>Recette Soupe à Loignon Без НАС). Данные правильно извлекаются из базы данных (mysql).
Однако, когда я пытаюсь закодировать это как json, используя php, встроенный в json_encode, он выдает нулевое значение json (сервер OS X: php 5.3.4, включен json 1.2.1).
На сервере Linux описание обрывается после первого символа ударения.
Я перепробовал все параметры json_encode без успех. Есть какие-нибудь предложения?
Спасибо.
6 answers
json_encode
только хочет utf-8
. В зависимости от вашего набора символов вы можете использовать iconv
или utf8_encode
перед вызовом json_encode
для вашей переменной. Вероятно, с array_walk_recursive
.
Как и было запрошено, незавершенный способ изменения массива с предположениями, что (1) он не содержит объектов и (2) ключи массива находятся в ascii/нижних границах, поэтому их можно оставить как есть:
$current_charset = 'ISO-8859-15';//or what it is now
array_walk_recursive($array,function(&$value) use ($current_charset){
$value = iconv('UTF-8//TRANSLIT',$current_charset,$value);
});
Я обнаружил, что это самый простой способ справиться с этим
echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
JSON_PRETTY_PRINT - делает доступным для чтения
JSON_UNESCAPED_UNICODE - правильно кодирует символы
JSON_UNESCAPED_SLASHES - избавляется от косой черты '\'
также обратите внимание, что эти опции разделены трубой '|'
Другим решением было бы использовать htmlentities
или utf8_encode
перед использованием json_encode
чтобы передать закодированный символ
Вот так:
$array = array('myvalue' => utf8_encode('ééàà'));
return json_encode($array);
Или с помощью htmlentities
:
$array = array('myvalue' => htmlentities('ééàà'));
return json_encode($array);
<?
$sql=mysql_query("SELECT * FROM TABLE...");
while($row=mysql_fetch_array($sql))
{
$output[]=array_map("utf8_encode", $row);
}
print(json_encode($output));
mysql_close();
?>
$json = utf8_encode($string);
$json = json_decode($json);
В соответствии с документами PHP
Эта функция работает только с данными в кодировке UTF-8.