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连接语句之后.
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'
使用此代码可能有所帮助.它解决了我的问题!
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)