PHP json encode - искаженные символы UTF-8, возможно, неправильно закодированные
Я использую json_encode($data)
для массива данных, и там поле содержит русские символы.
Я использовал этот mb_detect_encoding()
для отображения кодировки для этого поля, и он отображает UTF-8.
Я думаю, что кодирование JSON не удалось из-за некоторых плохих символов в нем, как "ра▒". Я пробовал много вещей utf8_encode
для данных, и он пропустит эту ошибку, но тогда данные больше не выглядят корректными.
Что можно сделать с этим вопросом?
Ответы
Ответ 1
Проблема возникает, если в ней есть некоторые не-utf8-символы, хотя большинство из них - символы utf8. Это приведет к удалению любых символов, отличных от utf8, и теперь это работает.
$data['name'] = mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
Ответ 2
Если у вас многомерный массив для кодирования в формате JSON, вы можете использовать функцию ниже:
Если произошел JSON_ERROR_UTF8:
$encoded = json_encode( utf8ize( $responseForJS ) );
Функция ниже используется для кодирования данных массива рекурсивно
/* Use it for json_encode some corrupt UTF-8 chars
* useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode
*/
function utf8ize( $mixed ) {
if (is_array($mixed)) {
foreach ($mixed as $key => $value) {
$mixed[$key] = utf8ize($value);
}
} elseif (is_string($mixed)) {
return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
}
return $mixed;
}
Ответ 3
Пожалуйста, убедитесь, что вы инициировали свой объект Pdo с помощью charset iso как utf8. Это должно устранить эту проблему, не допуская повторного танца.
$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
Ответ 4
вы просто добавляете в свой pdo connection charset = utf8, как показано ниже в строке подключения pdo:
$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
Надеюсь, что это поможет вам
Ответ 5
Удалите html-объекты для кодирования jason. Я использовал html_entity_decode() в php, и проблема была решена,
$json = html_entity_decode($source);
$data = json_decode($json,true);