Как сделать массив json_encode с французским акцентом? - PullRequest
23 голосов
/ 03 августа 2011

У меня есть элемент массива с французским акцентом ([WIPDescription] => Recette Soupe à lOignon Sans Boeuf US). Данные правильно извлекаются из базы данных (mysql).

Однако, когда я пытаюсь закодировать это как json, используя php, встроенный в json_encode, он выдает нулевое значение json (сервер OS X: php 5.3.4, json 1.2.1 включен).

На сервере Linux описание обрезается после первого символа ударения.

Я попробовал все параметры json_encode безуспешно. Есть предложения?

Спасибо.

Ответы [ 7 ]

30 голосов
/ 13 мая 2015

Я нашел, что это самый простой способ справиться с этим

echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

JSON_PRETTY_PRINT - делает читабельным
JSON_UNESCAPED_UNICODE - правильно кодирует символы
JSON_UNESCAPED_SLASHES - избавляет от косой черты '\'
также обратите внимание, что эти опции разделены трубкой '|'

16 голосов
/ 03 августа 2011

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);

});
10 голосов
/ 15 мая 2013

Другое решение - использовать htmlentities или utf8_encode перед использованием json_encode для передачи закодированного символа

как это:

   $array = array('myvalue' => utf8_encode('ééàà'));
   return json_encode($array);

Или используя htmlentities:

   $array = array('myvalue' => htmlentities('ééàà'));
   return json_encode($array);
4 голосов
/ 02 февраля 2012
<? 

$sql=mysql_query("SELECT * FROM TABLE...");

while($row=mysql_fetch_array($sql))
{
    $output[]=array_map("utf8_encode", $row);
}
print(json_encode($output));
mysql_close();

?>
1 голос
/ 18 февраля 2019

Если вы имеете дело с диакритическими знаками, вы также можете добавить JSON_PARTIAL_OUTPUT_ON_ERROR, и это устранит только проблемы и оставит все остальное без изменений.Я использовал utf_encode, прежде чем я нашел это, но это испортило диакритические знаки.

echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR);
1 голос
/ 28 июня 2017
$json = utf8_encode($string);

$json = json_decode($json);
1 голос
/ 03 августа 2011

По PHP документам

Эта функция работает только с данными в кодировке UTF-8.

...