簡體   English   中英

PHP json 編碼 - 格式錯誤的 UTF-8 字符,可能編碼不正確

[英]PHP json encode - Malformed UTF-8 characters, possibly incorrectly encoded

我正在將json_encode($data)用於數據數組,並且有一個字段包含俄語字符。

我使用這個mb_detect_encoding()來顯示該字段的編碼,並顯示 UTF-8。

我認為 json 編碼失敗是因為里面有一些不好的字符,比如“ра▒”。 我在數據上嘗試了很多utf8_encode方法,它會繞過該錯誤,但隨后數據看起來不再正確。

這個問題可以做什么?

如果里面有一些非 utf8 字符,即使其中大部分是 utf8 字符,也會出現問題。 這將刪除任何非 utf8 字符,現在它可以工作了。

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

如果您有一個多維數組以 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;
}

請確保使用字符集 iso 作為 utf8 啟動您的 Pdo 對象。 這應該可以解決這個問題,避免任何重新 utf8izing 的舞蹈。

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

在 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);

您只需添加您的 pdo 連接charset=utf8如下面的 pdo 連接:

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

希望能幫到你

在 JSON 編碼之前刪除 HTML 實體。 我在PHP中使用了html_entity_decode() ,問題解決了

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

您的結果集中是否有 UUID? 在這種情況下,以下數據庫標志將有所幫助:

PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => true

例如,如果您的數據在數據庫中編碼良好,請確保在 json_encode 之前使用 mb_ * 函數進行字符串處理。 substr 或 strlen 之類的函數不適用於 utf8mb4,並且可能會剪切您的文本並留下格式錯誤的 UTF8

我知道這是一個古老的話題,但對我來說這是我需要的。 我只需要修改答案'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); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM