Подтвердить что ты не робот

Json_encode(): Недопустимая последовательность UTF-8 в аргументе

Я вызываю json_encode() для данных, которые поступают из базы данных MySQL с помощью сортировки utf8_general_ci. Проблема в том, что некоторые строки имеют странные данные, которые я не могу очистить. Например, символ , поэтому, как только он достигнет json_encode(), он терпит неудачу с json_encode(): Invalid UTF-8 sequence in argument.

Я пробовал utf8_encode() и utf8_decode() даже с mb_check_encoding(), но он продолжает проникать и вызывать хаос.

Запуск PHP 5.3.10 на Mac. Итак, вопрос в том, как я могу очистить недействительные символы utf8, сохраняя остальную информацию, чтобы json_encoding() работал?

Update. Вот способ воспроизвести его:

echo json_encode(pack("H*" ,'c32e'));
4b9b3361

Ответ 1

Кажется, что символ был Å, но поскольку данные состоят из фамилий, которые не должны быть общедоступными, была показана только первая буква, и это было сделано только с помощью $lastname[0], что неверно для многобайтовых строк и вызвало целое хлопот. Изменено на mb_substr($lastname, 0, 1) - работает как прелесть.

Ответ 2

У меня была аналогичная ошибка, из-за которой json_encode возвращал нулевое поле всякий раз, когда в строке присутствовал символ hi-ascii, такой как кудрявый апостроф в строке из-за неправильного набора символов, возвращаемого в запросе.

Решение заключалось в том, чтобы убедиться, что оно появилось как utf8, добавив:

mysql_set_charset('utf8');

после инструкции mysql connect.

Ответ 3

Проблема в том, что этот символ UTF8, но json_encode не справляется с этим. Чтобы сказать больше, есть список других символов (см. список символов Юникода), который вызовет ту же ошибку, поэтому отключение этого (Å) не будет исправлено проблема до конца.

Что мы использовали для преобразования этих символов в html-объекты вроде этого:

htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);

Ответ 4

Убедитесь, что ваша кодировка соединений в MySQL - UTF-8. Часто по умолчанию используется ISO-8859-1, что означает, что драйвер MySQL преобразует текст в ISO-8859-1.

Вы можете установить кодировку соединений с помощью mysql_set_charset, mysqli_set_charset или с запросом SET NAMES 'utf-8'

Ответ 5

Использование этого кода может помочь. Это решило мою проблему!

mb_convert_encoding($post["post"],'UTF-8','UTF-8');

или тому подобное

mb_convert_encoding($string,'UTF-8','UTF-8');

Ответ 6

Символ, который вы отправили, является символом-заполнителем для разбитой последовательности байтов. В принципе, это не настоящий символ, а ошибка в вашей строке.

Каково точное значение байта символа? Слепое применение utf8_encode - это не очень хорошая идея, лучше сначала узнать, откуда пришли байты и что они означают.

Ответ 7

Другая вещь, которая порождает эту ошибку, когда вы используете функцию php json_encode, - это когда символы Юникода - это верхний регистр \U, а не нижний регистр\u

Ответ 8

json_encode работает только с данными UTF-8. Вы должны будете убедиться, что ваши данные находятся в UTF-8. альтернативно, вы можете использовать iconv(), чтобы преобразовать ваши результаты в UTF-8, прежде чем загружать их в json_encode()

Ответ 9

Обновлено. Я решил эту проблему, указав кодировку на PDO-соединение, как показано ниже:

"MySQL: хост = $хост; имя_бд = $дб, кодировка = utf8"

Все полученные данные были в правильной кодировке для остальной части кода, чтобы использовать

Ответ 10

I am very late but if some one working on SLIM to make rest api and getting same error can solve this problem by adding below line as:

<?php

// DbConnect.php file
class DbConnect
{
    //Variable to store database link
    private $con;

    //Class constructor
    function __construct()
    {

    }

    //This method will connect to the database
    function connect()
    {
        //Including the constants.php file to get the database constants
        include_once dirname(__FILE__) . '/Constants.php';

        //connecting to mysql database
        $this->con = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

        mysqli_set_charset($this->con, "utf8"); // add this line 
        //Checking if any error occured while connecting
        if (mysqli_connect_errno()) {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
        }

        //finally returning the connection link
        return $this->con;
    }
}

Ответ 11

Использование setLocale ('fr_FR.UTF8') до того, как json_encode решил проблему.