首页 > 解决方案 > 在 Nodejs 中,为什么缓冲区表示会根据字符编码而改变?

问题描述

我想知道为什么 string'foo'表示为 Buffer 时,但使用不同的编码是不同的?

Buffer.from('foo', 'utf-8') /* <Buffer 66 6f 6f> */

Buffer.from('foo', 'ascii') /* <Buffer 66 6f 6f> */

Buffer.from('foo', 'base64') /* <Buffer 7e 8a> */

Buffer.from('foo', 'utf16le') /* <Buffer 66 00 6f 00 6f 00> */

我可能对缓冲区不够了解。以下是我对缓冲区的了解:

缓冲区是内存区域。

它代表一个固定大小的内存块(不能调整大小)

您可以将缓冲区想象成一个整数数组,每个整数代表一个数据字节。

我理解它的方式(以非常简单的方式),我知道我们只能将字符串存储foo为二进制,而字符编码是不同类型的数据可以从任何格式转换为二进制的方式。

我现在的问题是,为什么字符编码会改变缓冲区的结果?

标签: node.jsencodingcharacterbuffer

解决方案


因为 javascript 内部有使用 [deprecated] Unicode 编码 UCS-2 编码的字符串。编码是将字形映射到 Unicode 代码点的一种方式。

  • US-ASCII将前 128 个 ASCII 字符 (0x00–0x7F) 表示为单个八位字节(字节)。超出该范围的任何内容都无法表示。因为这就是 ASCII ——尽管有不同的 ASCII 风格使用八位字节的高位作为奇偶校验位,有些使用偶数奇偶校验,有些使用奇数奇偶校验。

  • UTF-8是一种将所有 Unicode 代码点编码为 1-4 个 8 位“代码单元”的方法。前 128 个代码点(US-ASCII,U+0000–U+007F)得到一个八位字节;接下来的 1,920 (U+0080–U+07FF) 需要 2 个八位字节进行编码,依此类推。

  • UTF-16与此类似,但使用了 2 个八位字节的代码单元,因此每个 Unicode 代码点(字符、字形)将至少占用 2 个八位字节(1 个代码单元)。这也引入了字节顺序的概念(我们是 big-endian 还是 little-endian?),因此任何 UTF-16 字符串都必须以 Unicode BOM(字节顺序标记)为前缀,因此最短的 UTF-16 编码单个字符串将是 4 个八位字节(2 个用于 BOM,2 个用于单个 ASCII 代码点)。

  • Base 64是一种对随机八位字节序列进行编码的方式,以便通过网络进行 [安全] 传输。


推荐阅读