Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解码流中utf8字符串的数组_Javascript_Utf 8 - Fatal编程技术网

Javascript 解码流中utf8字符串的数组

Javascript 解码流中utf8字符串的数组,javascript,utf-8,Javascript,Utf 8,我今天在尝试解码utf8格式的字符串后遇到了一个奇怪的问题。它被作为字符串数组通过流获取,但不知何故被格式化为utf8(我正在使用)。但是,正如您在控制台中看到的,如果我直接记录它,它将显示正确的版本,但是当它位于对象文本中时,它将返回utf8编码的版本 var stream = fs .createReadStream(__dirname + '/my.csv') .pipe(csv({ ignoreEmpty: true })) .on('data', data

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

  var stream = fs
    .createReadStream(__dirname + '/my.csv')
    .pipe(csv({ ignoreEmpty: true }))
    .on('data', data => {
        console.log(data[0])
        // prints farren@rogers.com
        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' }
    })
欢迎提供任何解决方案或解释


编辑:即使在使用解码并在对象文本中传递它之后,我仍然会遇到同样的问题。

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

\u0000f\u0000a\u0000r\u0000r\u0000e\u0000n
这意味着字符串的代码单位是\u0000 f\u0000 a等。\uhhh转义表示十六进制的UTF-16代码单位hhh\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位值存储为字节时,endianness适用。在little endian中,0x0066写为0x66 0x00。在big-endian中,0x00 0x66

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

字符编码的基本规则是使用与写入文本相同的编码进行读取。任何这样做都不会导致数据丢失和损坏,甚至无法被检测到。不知道编码是从什么开始的,这本身就是数据丢失和通信失败


您可以在上了解有关Unicode的更多信息。您可以从各自的规范中了解到更多关于使用它的语言和技术的信息,它们都是非常前沿和清晰的,Java、C#、VBA/VB4/VB5/VB6、VB.NET、F#、HTML、XML、T-SQL等等,…。(好的,VB4文档可能不太清楚,但重点是这是非常常见的,而不是新的[],尽管我们仍在努力吸收它。)

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

\u0000f\u0000a\u0000r\u0000r\u0000e\u0000n
这意味着字符串的代码单位是\u0000 f\u0000 a等。\uhhh转义表示十六进制的UTF-16代码单位hhh\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位值存储为字节时,endianness适用。在little endian中,0x0066写为0x66 0x00。在big-endian中,0x00 0x66

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

字符编码的基本规则是使用与写入文本相同的编码进行读取。任何这样做都不会导致数据丢失和损坏,甚至无法被检测到。不知道编码是从什么开始的,这本身就是数据丢失和通信失败


您可以在上了解有关Unicode的更多信息。您可以从各自的规范中了解到更多关于使用它的语言和技术的信息,它们都是非常前沿和清晰的,Java、C#、VBA/VB4/VB5/VB6、VB.NET、F#、HTML、XML、T-SQL等等,…。(好的,VB4文档可能不太清楚,但重点是这是非常常见的,而不是新的[],尽管我们仍在努力将其同化。)

鉴于输出中交错的NUL字符,似乎输入可能是UTF-16,被读取为UTF-8。询问CSV文件的作者他们选择了哪种编码(或者要求使用xlsx,因为它们更能自我描述)。@TomBlodget哦,天哪,我真不敢相信我还没有检查过。我一直以为它是utf8,因为它是从谷歌联系人导出的。你可以回答这个问题,我将把它标记为已接受。谢谢大家!@顺便说一句,你所说的交错字符是什么意思?我怎样才能自学这些东西?你看到一个你发现的特殊字符了吗?考虑到输出中交织的NUL字符,看起来输入可能是UTF-16,读作UTF-8。询问CSV文件的作者他们选择了哪种编码(或者要求使用xlsx,因为它们更能自我描述)。@TomBlodget哦,天哪,我真不敢相信我还没有检查过。我一直以为它是utf8,因为它是从谷歌联系人导出的。你可以回答这个问题,我将把它标记为已接受。谢谢大家!@顺便说一句,你所说的交错字符是什么意思?我怎样才能自学这些东西?你看到一个特殊的字符了吗?我通过谷歌联系人导出了csv文件,不知道它是UTF-16。在阅读了你的答案后,我在VSC而不是Vim中打开了它,看到它实际上是UTF-16,将它改为UTF-8,一切都开始工作了。我通过谷歌联系人导出了csv文件,但不知道它是UTF-16。在阅读了你的答案后,我在VSC而不是Vim中打开了它,看到它实际上是UTF-16,将它改为UTF-8,一切又开始工作了