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() будет работать?

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

echo json_encode(pack("H*" ,'c32e'));
11 55

11 ответов:

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

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

mysql_set_charset('utf8');

после выхода новой версии MySQL подключиться.

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

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

мы использовали для преобразования этих символов в HTML-объекты следующим образом:

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

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

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

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

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

или вот так

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

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

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

еще одна вещь, которая вызывает эту ошибку, когда вы используете функцию json_encode php, - это когда символы unicode являются верхним регистром ,а не нижним регистром!--1-->

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

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

"MySQL сервер:хост=$рать;значение dbname=$дБ;кодировка=utf8 в"

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

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

с помощью setLocale ('fr_FR.UTF8'), прежде чем json_encode решил проблему.