PHP json编码 - 格式错误的UTF-8字符,可能编码错误

时间:2017-09-19 16:11:09

标签: php json encoding utf-8

我正在将json_encode($ data)用于数据数组,并且有一个字段包含俄语字符。我使用这个mb_detect_encoding()来显示该字段的编码,并显示UTF-8。我认为json编码失败是由于其中的一些不良字符,如“ра▒”。我在数据上尝试了很多东西utf8_encode,它会传递那个错误但是数据看起来不再正常了。

这个问题可以做些什么?

8 个答案:

答案 0 :(得分:37)

如果内部有一些非utf8字符,即使大多数字符都是utf8字符,也会出现问题。这将删除任何非utf8字符,现在它可以正常工作。

$data['name'] = mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');

答案 1 :(得分:14)

如果您有一个多维数组以JSON格式编码,则可以使用以下函数:

如果发生JSON_ERROR_UTF8:

$encoded = json_encode( utf8ize( $responseForJS ) );

以下功能用于递归编码数组数据

/* Use it for json_encode some corrupt UTF-8 chars
 * useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode
 */
function utf8ize( $mixed ) {
    if (is_array($mixed)) {
        foreach ($mixed as $key => $value) {
            $mixed[$key] = utf8ize($value);
        }
    } elseif (is_string($mixed)) {
        return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
    }
    return $mixed;
}

答案 2 :(得分:6)

请确保使用字符集iso作为utf8来启动Pdo对象。 这样可以解决此问题,避免重新舞蹈。

$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');

答案 3 :(得分:1)

您只需添加pdo连接 charset = utf8 就像下面的pdo连接行:

$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');

希望这会对您有所帮助

答案 4 :(得分:0)

在jason编码之前删除html实体。我在php中使用了html_entity_decode()并解决了问题,

$json = html_entity_decode($source);
$data = json_decode($json,true);

答案 5 :(得分:0)

在php 7.2中,有两个选项允许直接在json_encode中管理无效的UTF-8:

https://www.php.net/manual/en/function.json-encode

json_encode($text, JSON_INVALID_UTF8_IGNORE);

json_encode($text, JSON_INVALID_UTF8_SUBSTITUTE);

答案 6 :(得分:0)

您的结果集中是否有 UUID?在这种情况下,以下数据库标志将有所帮助:

PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => true

答案 7 :(得分:-1)

我知道这是一个古老的话题,但是对我来说这正是我所需要的。我只需要修改答案“ jayashan perera”。

//...code
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);


        for ($i=0; $i < sizeof($result) ; $i++) { 
            $tempCnpj = $result[$i]['CNPJ'];
            $tempFornecedor = json_encode(html_entity_decode($result[$i]['Nome_fornecedor']),true) ;
            $tempData = $result[$i]['efetivado_data'];
            $tempNota = $result[$i]['valor_nota'];
            $arrResposta[$i] = ["Status"=>"true", "Cnpj"=>"$tempCnpj", "Fornecedor"=>$tempFornecedor, "Data"=>"$tempData", "Nota"=>"$tempNota" ];
        }

        echo json_encode($arrResposta);

我没有使用过.js

obj = JSON.parse(msg); 
相关问题