在Nodejs中,为什么缓冲区表示根据字符编码而改变?



我想知道为什么字符串'foo',当表示为缓冲区时,但具有不同的编码是不同的?

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存储为二进制,而字符编码是不同类型的数据可以从任何格式转换为二进制的方式。

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

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

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

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

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

  • Base 64是一种对随机八位字节序列进行编码的方法,以便在线路上[安全]传输。

相关内容

  • 没有找到相关文章

最新更新