![](/img/trans.png)
[英]PHP JSON_encode() is getting “Malformed UTF-8 characters, possibly incorrectly encoded” (error)
[英]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.