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() но он продолжает mb_check_encoding() и вызывать хаос.

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

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

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

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

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

 mysql_set_charset('utf8'); 

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

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

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

Мы использовали для преобразования этих символов в 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, – это когда символы Юникода – это верхний регистр \ U, а не нижний регистр \ u

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

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

"MySQL: хост = $ хост; имя_бд = $ дб, кодировка = 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 решил проблему.