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