在尝试解码 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] 删除。
我来说两句