Unicode编码字符串

时间:2014-08-21 19:11:08

标签: javascript php json

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)

所以你看,编码它对某些字符串很有效并打破其他字符串。

这仅适用于日志记录。我不在乎二进制数据是否奇怪,我只是不想让它弄乱有效的字符串。

2 个答案:

答案 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字符。