这个问题在这里已经有了答案:UTF-8 all way through (13 answers) Closed 2 days ago。
我将 json_encode($data)
用于数据数组,并且有一个字段包含俄语字符。
我使用此 mb_detect_encoding()
来显示该字段的编码方式并显示 UTF-8。
我认为 json 编码失败是因为其中的一些坏字符,比如“ра▒”。我在数据上尝试了很多东西utf8_encode
,它会绕过该错误,但随后数据看起来不再正确。
这个问题可以做些什么?
JSON_UNESCAPED_UNICODE
选项?
utf8_encode()
用于将 8859-1 转换为 UTF8,输入 UTF8 字符串会损坏它。
如果里面有一些非 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;
}
mb_convert_encoding
自己执行递归工作,您可以在文档 link 中看到:如果 val 是一个数组,则它的所有字符串值都将被递归转换。 所以函数 utf8ize
不是需要。您只需要json_encode(mb_convert_encoding($responseForJS, "UTF-8", "UTF-8"));
请确保使用字符集 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);
不定期副业成功案例分享
$mysqli->set_charset("utf8");
$converted !== $address
条件永远不会满足。我想这是因为===
是一个“二进制安全”运算符... 2. 我最终没有得到错误,即使我从未将$converted
分配给任何东西!这就像mb_convert_encoding()
通过引用接受的字符串,虽然它不是......