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


json_encode(): Invalid UTF-8 sequence in argument

我正在对来自具有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'));

我有一个类似的错误,导致每当字符串中存在 hi-ascii 字符(例如卷曲撇号)时json_encode返回空字段,因为查询中返回了错误的字符集。

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

mysql_set_charset('utf8');

在 MySQL 连接语句之后。

似乎符号是Å的,但由于数据由不应该公开的姓氏组成,因此只显示了第一个字母,并且仅由$lastname[0]完成,这对于多字节字符串来说是错误的,并造成了整个麻烦。将其更改为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'来设置连接字符集

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

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

或类似

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

您发布的符号是断开字节序列的占位符符号。基本上,它不是一个真正的符号,而是字符串中的一个错误。

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

当你使用 php 的 json_encode 函数时,引发此错误的另一件事是当 unicode 字符是大写的 ''u 而不是小写的 ''u

>json_encode仅适用于 UTF-8 数据。您必须确保您的数据采用 UTF-8。或者,您可以使用 iconv() 将结果转换为 UTF-8,然后再将它们提供给 json_encode()

已更新。我通过在PDO连接上声明字符集来解决此问题,如下所示:

"mysql:host=$host;dbname=$db;charset=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;
    }
}

Using setLocale('fr_FR.UTF8')之前json_encode解决了问题。