2

使用 php 我解析一个包含 unicode 字符的文本文件,例如

只需读入文件而无需任何进一步的编码/解码笑脸被解析,然后 json_encoded 和输出是\u00f0\u009f\u0098\u008d

一个 javascript 文件获取 .json 数据并将 4 个转义字符输出为ð

查看一个 unicode 表,该符号被称为“SMILING FACE WITH HEART-SHAPED EYES”并且具有 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 correct

4

2 回答 2

1

你的问题让我困惑的是\u00f0\u009f\u0098\u008d顺序。它只是听起来不像任何标准化的东西。

正如您所写,这是关于 Unicode 字符 'SMILING FACE WITH HEART-SHAPED EYES' (U+1F60D)。您提供的\u基于符号似乎表明这将是 Javascript / JSON 编码的 unicode 字符。所以让我们回顾一下:

  • JSON 对不在基本多语言平面(U+0000 到 U+FFFF)中的任何内容使用 UTF-16 代理对。
  • U+1F60D不在基本多语言窗格中。
  • 它是 UTF-16 编码,因此是 0xD83D 0xDE0D
  • 这不是你所拥有的
  • 它的 UTF-8 编码是 xF0 0x9F 0x98 0x8D
  • 这看起来像你滥用的东西。

在这个快速分析之后,答案如下:如果您可以认为所有\u????序列都同样被误用于编码 UTF-8 二进制序列,那么您需要做的就是钩住其中的每一个,将编码在最后一个十六进制数字,它是末尾的两个十六进制数字对(位置 5+6 / 索引 4+5)并将其放在一起。

由于这看起来很糟糕,我不建议在这里使用完整的源代码,因为我不想特别支持这种做法 - 你需要在编码中修复它 - 但是你可以在PHP DomDocument 无法处理的答案中找到概述的代码utf-8 个字符 (☆) .

所以修复包含错误的输入字符串\u(u 在这里代表 unicode,但它不是你的情况,因为那些暗示 UTF-16不是二进制八位字节)。您需要了解这些错误\u序列的引入位置,您的问题尚不清楚。

于 2013-09-05T10:23:26.473 回答
1

你所拥有的是将 UTF-8 数据解码为 ISO-8859-1 (latin1) 到 Unicode,然后进行 JSON 编码。如果你:

  1. 将 JSON 解码为 Unicode。
  2. 使用 latin-1 编码为字节。
  3. 使用 UTF-8 解码为 Unicode。

这应该给你正确的字符。我不做 PHP,但这里有一个 Python 证明:

>>> '\u00f0\u009f\u0098\u008d'.encode('latin1').decode('utf8')
'\U0001f60d'
>>> import unicodedata as ud
>>> ud.name('\U0001f60d')
'SMILING FACE WITH HEART-SHAPED EYES'

数据首先出现乱码的原因可能是 HTML 实际上是 UTF-8 编码的,但错误地声明了 ISO-8859-1 或 Windows-1252。

于 2013-09-06T06:16:48.493 回答