node.js - 节点中的缓冲区
问题描述
考虑遵循节点代码
const bufA = Buffer.from('tést');
缓冲区:
<缓冲器 74 c3 a9 73 74>
为什么将输入中的四个字符转换为 5 个十六进制字节?
解决方案
当你打电话时Buffer.from(string)
,会发生几件事:
- 编码默认为
utf-8
- JS 字符串,内部存储为 UCS-2 字符数组,编码为 UTF-8
在 UTF-8 中,é
是一个多字节字符,就像拉丁文字中的大多数重音字符一样。以下是有关字符在不同系统中如何编码的更多信息:https ://www.fileformat.info/info/unicode/char/e9/index.htm
如您所见,该字符的 UTF-8 表示形式是0xC3 0xA9
,它对应c3 a9
于 Buffer 中的第二个和第三个字节。
这也意味着,在解码缓冲区时(例如,当连接来自流的数据时),一些字符可能会落在缓冲区边界上,并且可能无法解码字符串,直到您拥有字符的其余部分(0xC3 本身将是无效的)。这就是为什么您在 Web 上找到的代码示例:
let result = '';
stream.on('data', function(buf) {
// BUG! Does not account for multi-byte characters.
result += buf.toString();
});
几乎总是错误的 - 除非 Stream 已经设置为处理编码本身(然后,在读取时你会得到字符串,而不是缓冲区)。
推荐阅读
- csv - 为每个循环条目 iMacros 编写确认列 (CSV)
- css - 我无法使用 Angular 12 将记录插入到 Firestore 数据库中
- python - 迭代数据框中的行并将对象添加到列表中
- java - Jackson 使用许多动态节点反序列化 JSON
- arrays - 从以“NULL”为参数的函数返回值
- java - 您将如何在 VSCode 上执行此操作?
- java - 如何从 .clas 或 .java 生成 .jsp
- node.js - 只接受数字 discord.js
- python - 我是使用 python 制作不和谐机器人的新手,但我遇到了麻烦。我发送“$hello”以获得响应,但没有任何反应
- r - 从 CRAN 和 GitHub 安装 systemfonts 包失败