node.js - 在 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
为二进制,而字符编码是不同类型的数据可以从任何格式转换为二进制的方式。
我现在的问题是,为什么字符编码会改变缓冲区的结果?
解决方案
因为 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是一种对随机八位字节序列进行编码的方式,以便通过网络进行 [安全] 传输。
推荐阅读
- pip - 从另一个分支上的 github 子目录安装 python 包
- javascript - 使用 Javascript 创建 Outlook 电子邮件并格式化电子邮件正文
- c++ - 半精度 PyTorch 浮点张量与单精度浮点张量具有相同的性能吗?
- c - C:计算出的机器 epsilon 与 limits.h 不同
- themes - 如何在 Blazor Web 程序集中集成主题森林主题?
- excel - Excel:查找一个值并指示它是否在其他地方使用 INDEX/MATCH
- reactjs - 您将如何重置 onClick 的无线电输入?反应式
- regex - 正则表达式字母之间任意数量的 _
- visual-studio-code - VS代码查找和替换:选择多行时替换选择会产生意外结果?
- python - 如何从 .txt 文件中提取数据并将其存储在 2 个单独的变量中?