解码流中的 utf8 字符串数组

萨诺荣宝也

在尝试解码 utf8 格式的字符串后,我今天遇到了一个奇怪的问题。它作为字符串数组通过流获取,但以某种方式以 utf8 格式(我使用的是fast-csv)。但是,正如您在控制台中看到的那样,如果我直接记录它,它会显示正确的版本,但是当它位于对象文字中时,它会返回到 utf8 编码版本。

  var stream = fs
    .createReadStream(__dirname + '/my.csv')
    .pipe(csv({ ignoreEmpty: true }))
    .on('data', data => {
        console.log(data[0])
        // prints [email protected]
        console.log({ firstName: data[0] })
        // prints { firstName: '\u0000f\u0000a\u0000r\u0000r\u0000e\u0000n\u0000@\u0000r\u0000o\u0000g\u0000e\u0000r\u0000s\u0000.\u0000c\u0000o\u0000m\u0000' }
    })

任何解决方案或解释表示赞赏。

编辑:即使在使用utf8.js解码然后将其传递到对象文字中后,我仍然遇到同样的问题。

汤姆·布洛杰特

JavaScript 对字符串使用 UTF-16。它还具有用于 UTF-16 代码单元的数字转义符号。因此,当您在调试器中看到此输出时

\u0000f\u0000a\u0000r\u0000r\u0000e\u0000n

据说字符串的代码单元是 \u0000 f \u0000 a 等。 \uHHHH 转义表示十六进制的 UTF-16 代码单元 HHHH。\u0000 是 U+0000 (NUL) Unicode 代码点所需的单个(未配对)UTF-16 代码单元。所以,有些东西被解释为 NUL f NUL a 等。

UTF-8 代码单元每个是 8 位。UTF-8 中的 NUL 是 0x00。f 是 0x66。

UTF-16 代码单元每个是 16 位。NULL 为 0x0000。f 是 0x0066。当 16 位值存储为字节时,字节序适用。在小端中,0x0066 写为 0x66 0x00。在大端,0x00 0x66。

因此,如果 UTF-16 代码单元的字节(例如示例数据中的字节)被解释为 UTF-8(或可能是其他编码),则 f 可以读取为 NUL f 或 f NUL。

字符编码的基本规则是使用与写入文本相同的编码来读取。不这样做会导致数据丢失和损坏,而这种情况可能会在未被发现的情况下继续存在。不知道编码是从什么开始是数据丢失本身和通信失败。

您可以在Unicode.org 上了解有关 Unicode 的更多信息您可以从各自的规范中了解更多有关使用它的语言和技术的信息——它们都非常预先明确。JavaScript , Java, C#, VBA/VB4/VB5/VB6, VB.NET, F#, HTML, XML, T-SQL,.... (好吧,VB4 文档可能不太清楚,但关键是这很常见,而且并不新鲜 [ VBPJ Sept. 1996 ],尽管我们仍在努力吸收它。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章