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

Art*_*pov 57 php json character-encoding

我正在调用json_encode()来自带有utf8_general_ci整理的MySQL数据库的数据.问题是有些行有奇怪的数据,我无法清理.例如符号?,所以一旦到达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'));
Run Code Online (Sandbox Code Playgroud)

小智 33

我不得不引起json_encode返回每当有一个HI-ASCII字符空领域,如在一个字符串卷曲撇号,由于错误的字符在查询中设置返回类似的错误.

解决方案是通过添加以下内容确保它以utf8形式出现:

mysql_set_charset('utf8');
Run Code Online (Sandbox Code Playgroud)

在mysql连接语句之后.

  • 或者`mysqli_set_charset($ con,"utf8");`和mysqli.谢谢! (14认同)

Art*_*pov 23

似乎符号是Å,但由于数据由不应该公开的姓氏组成,所以只显示了第一个字母,而且它是由just完成的$lastname[0],这对于多字节字符串是错误的并且导致整个麻烦.把它改成了mb_substr($lastname, 0, 1)- 就像一个魅力.


小智 21

问题是这个字符是UTF8,但json_encode没有正确处理它.更多的说,有一个其他字符的列表(参见Unicode字符列表),它将触发相同的错误,因此剥离这个(Å)将不会纠正问题到最后.

我们使用的是将这些字符转换为html实体,如下所示:

htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);
Run Code Online (Sandbox Code Playgroud)


Emi*_*röm 13

确保您与MySQL的连接字符集是UTF-8.它通常默认为ISO-8859-1,这意味着MySQL驱动程序将文本转换为ISO-8859-1.

您可以使用mysql_set_charset,mysqli_set_charset或查询设置连接字符集SET NAMES 'utf-8'


Can*_*dağ 7

使用此代码可能有所帮助.它解决了我的问题!

mb_convert_encoding($post["post"],'UTF-8','UTF-8');
Run Code Online (Sandbox Code Playgroud)

或者那样

mb_convert_encoding($string,'UTF-8','UTF-8');
Run Code Online (Sandbox Code Playgroud)