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

时间:2012-04-18 08:35:14

标签: php json character-encoding

我正在使用json_encode()排序规则调用来自MySQL数据库的数据utf8_general_ci。问题是有些行有奇怪的数据,我无法清理。例如符号,因此一旦达到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'));

10 个答案:

答案 0 :(得分:32)

我遇到了类似的错误,导致json_encode在字符串中出现hi-ascii字符(例如卷曲撇号)时返回空字段,原因是查询中返回了错误的字符集。

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

mysql_set_charset('utf8');

在mysql连接语句之后。

答案 1 :(得分:23)

似乎符号是Å,但由于数据由不应公开的姓氏组成,因此只显示了第一个字母,而且仅由$lastname[0]完成,这对于多字节字符串是错误的并造成了整个麻烦。将其更改为mb_substr($lastname, 0, 1) - 就像魅力一样。

答案 2 :(得分:21)

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

我们使用的是将这些字符转换为这样的html实体:

htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);

答案 3 :(得分:13)

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

您可以使用mysql_set_charsetmysqli_set_charset或查询SET NAMES 'utf-8'

设置连接字符集

答案 4 :(得分:3)

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

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

答案 5 :(得分:0)

当您使用php的json_encode函数时,抛出此错误的另一件事是unicode字符是大写字母\ U而不是小写字母\ u

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

“MySQL的:主机= $主机; DBNAME = $分贝;字符集= UTF8”

然后收到的所有数据都在正确的字符集中,供其他代码使用

答案 8 :(得分:0)

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;
    }
}

答案 9 :(得分:-1)

在json_encode解决问题之前使用setLocale(&#39; fr_FR.UTF8&#39;)。