【发布时间】:2013-09-05 09:54:06
【问题描述】:
我使用 php 解析一个包含 unicode 字符的文本文件,例如 ????
只需读入文件,无需任何进一步的编码/解码,笑脸被解析,然后 json_encoded 输出为\u00f0\u009f\u0098\u008d
一个 javascript 文件获取 .json 数据并将 4 个转义字符输出为 ð
查看 unicode 表,该符号称为“心形眼睛的微笑脸”,其 unicode 编号为 U+1F60D (128525)
有没有办法将 4 个代码单元转换为 unicodenumber 或理想情况下转换为适当的 html 编码方式,在本例中为 😍
查看转换,utf 8 代码单元看起来相似(F0 9F 98 8D 0A 0A),但我无法重现我得到的 4 个转义单元,所以我什至不知道我在看什么
更新:我弄错了,编辑了第二段:\u00f0\u009f\u0098\u008d已经是json_encode()的结果;
这是从文件中读取数据的基本功能,查看笑脸是“硬编码”的源代码,所以你真的看到了
function readLocalFile() {
$file_html = fopen('output.html', "r");
$html = "";
while(!feof($file_html)) {
$html .= fgets($file_html);
}
fclose($file_html);
// here I use regex to filter for specific tags, the result is an array
$cleanData = parseData($html);
saveToFile(json_encode($cleanData));
}
我刚刚创建了一个只有 ???? 作为内容的 dummy.html,这会返回正确的结果 \ud83d\ude0d,在整个数据的上下文中,它仍然如上所述被破坏,很奇怪
我得看看数据保存到output.html的方式,这就是问题所在。我一直在看问题的错误部分,哦!
上次更新:终于找到错误了。它在 parseData-function 中,loadHTML 以某种方式混淆了内容,在这里找到了解决方案: PHP DOMDocument loadHTML not encoding UTF-8 correctly
【问题讨论】:
-
这个 IS UTF-8,末尾的 0A 0A 已经是下一个字符(CR 或 LF)了。
-
您的输入字符串已损坏,
\u00f0\u009f\u0098\u008d显然不是U+1F60D,因为那将是\ud83d\ude0d。你应该看看为什么你在输入字符串中有这个。这看起来有点像从 UTF-8 到 JSON 的被误解的“转换”,可能是由于 PHP json unicode 处理损坏(#62010?)你应该分享一些代码来说明更多。 -
刚刚看到您的编辑。在将
json_encode传递给json_encode之前,您能否提供the string hex-encoded 的样本?如果它很长或包含私人信息,也许只需将其减少到造成问题的部分。