json_encode():参数中的UTF-8序列无效

我使用utf8_general_ci归类对来自MySQL数据库的数据调用json_encode() 。 问题是有些行有奇怪的数据,我不能清理。 例如符号 ,所以一旦到达json_encode() ,就会失败,并带有json_encode(): Invalid UTF-8 sequence in argument

我尝试过使用utf8_encode()utf8_decode() ,即使使用mb_check_encoding()但它一直在通过并造成严重破坏。

在Mac上运行PHP 5.3.10。 所以问题是 – 我怎样才能清理无效的utf8符号,保留其余的数据,以便json_encoding()将工作?

更新。 这是一个重现它的方法:

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

我有一个类似的错误,导致json_encode返回一个空字段,每当有一个hi-ascii字符,如一个string中的一个撇号,由于在查询中返回错误的字符集。

解决的办法是确保它来作为utf8join:

 mysql_set_charset('utf8'); 

之后的mysql连接语句。

似乎符号是Å ,但由于数据由不应该公开的姓氏组成,所以只显示第一个字母,只用$lastname[0] ,这对于多字节string是错误的,并导致整个麻烦。 将其更改为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' NAMES'utf SET NAMES 'utf-8'来设置连接字符集,

使用这个代码可能会有帮助 它解决了我的问题!

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

或者像那样

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

您发布的符号是破坏的字节序列的占位符符号。 基本上,这不是一个真正的符号,而是你的string中的错误。

符号的确切字节值是什么? 盲目地应用utf8_encode不是一个好主意,最好首先找出字节的来源以及它们的含义。

另一个引发这个错误的东西是,当你使用php的json_encode函数的时候,当unicode字符是大写\ U而不是小写\ u

json_encode仅适用于UTF-8数据。 你必须确保你的数据是UTF-8。 或者,您可以使用iconv()在将结果提供给json_encode()之前将结果转换为UTF-8,

更新..我解决了这个问题,说明在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; } } 

在json_encode解决问题之前使用setLocale('fr_FR.UTF8')。