Вопрос по json, php – json_encode (): неверная последовательность UTF-8 в аргументе

56

Я звоню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'));
bin2hex дает c32e Artjom Kurapov
"\xC3\x2E" действительно не является допустимой строкой UTF-8. Откуда это? MySQL не должен выводить неверные строки UTF-8, если он настроен на возврат UTF-8. deceze♦
У меня та же проблема, но я запрашиваю у SQL Server через соединение ODBC, и мой специальный символ: & # xAE ;. Кажется, никто не решил эту проблему. Salsero69
Вы пробовали флаг JSON_UNESCAPED_UNICODE? Benubird
Вы уверены, что восстанавливаете свои данные, закодированные в UTF-8, из базы данных? Какие данные у вас есть, что вы ожидаете? Покажите намbin2hex проблемных данных. deceze♦

Ваш Ответ

11   ответов
-1

как json_encode решит проблему.

21

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

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

htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
13

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

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

Вызывается SET NAMES, остальные данные поступают нормально Artjom Kurapov
0
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;
    }
}
3

последовательности байтов. По сути, это не реальный символ, а ошибка в вашей строке.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Artjom Kurapov
Error: User Rate Limit Exceeded Artjom Kurapov
Error: User Rate Limit ExceededwhatError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

0

указав кодировку на подключении PDO, как показано ниже:

& Quot; MySQL: хост = $ хоста; имя_бд = $ дб; кодировка UTF-8 = & Quot;

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

32

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

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

mysql_set_charset('utf8');

после заявления подключения mysql.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmysqli_set_charset($con, "utf8");Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
6

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

или как то

mb_convert_encoding($string,'UTF-8','UTF-8');
спасибо, сделал это для меня!
работал на меня, ууу!
23

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

Я просто наткнулся на ту же проблему; Оказывается, у меня былsubstr() позвони туда сродни твоему[0] разыменование ;-)
Кроме того, эта ошибка может быть выдана в json_encode после preg_replace с помощью regexp безu модификатор.
0

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

Похожие вопросы