我json_encoding
一些字符串。有时它们包含二进制数据。这会导致编码失败,错误代码为JSON_ERROR_UTF8
。通过utf8_encode
运行字符串可以解决此错误。但是,✓
(unicode复选标记)编码为\u00e2\u009c\u0093
,当用JavaScript解释并在浏览器中呈现时,实际上看起来像â
。
我该如何解决这个问题?我可以使用其他编码吗?
echo json_encode(utf8_encode('✓')); // "\u00e2\u009c\u0093"
现在按F12并将其粘贴到JavaScript控制台(包含引号)。它应该输出â
。
请注意
echo json_encode('✓'); // "\u2713"
按预期工作。问题是有时字符串将包含json_encode
无法处理的二进制数据,所以我需要清理每个字符串而不破坏可以处理。
更多例子:
json_encode(chr(200)); // false (bad)
json_encode(utf8_encode(chr(200))) // "\u00c8" (good)
json_encode('✓'); // "\u2713" (good)
json_encode(utf8_encode(chr(200))) // "\u00e2\u009c\u0093" (bad)
所以你看,编码它对某些字符串很有效并打破其他字符串。
这仅适用于日志记录。我不在乎二进制数据是否奇怪,我只是不想让它弄乱有效的字符串。
答案 0 :(得分:1)
通过此功能运行字符串
function _utf8($str) {
if(!mb_check_encoding($str, 'UTF-8')) {
return utf8_encode($str);
}
return $str;
}
(从here获取并修改)
似乎给出了我追求的结果。
单击复选标记,但编码chr(200)
和其他奇怪现象:
json_encode(utf8_encode(chr(200))) // "\u00c8"
答案 1 :(得分:0)
编辑:这个问题无法回答。编码任意二进制数据是一回事,保持UTF-8字符完整是完全独立的。什么阻止字节序列0xe29c93
在二进制数据中出现时被解释为✓
?
根据json_encode
PHP参考页面,您可以使用以下语法对Unicode字符进行编码:
json_encode($data, JSON_UNESCAPED_UNICODE);
它应该通过非转义传递unicode字符。