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')。