You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中不同字符编码下Buffer表示结果存在差异的原因是什么

不同编码生成Buffer结果差异的原因

核心原因非常简单:Buffer.from(字符串, 编码)的逻辑是按照你指定的编码规则,将输入字符串转换为对应的二进制字节序列存储到Buffer中,不同编码的映射规则、适用场景完全不同,最终得到的字节自然会有差异。

你给出的4个测试用例可以分别对应4种不同的规则:

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> */
  • utf-8和ascii结果一致:f、o都属于ASCII字符集覆盖的范围(0~127),而UTF-8编码对ASCII范围内的字符做了完全兼容的设计,单字节存储,映射值和ASCII完全一致,所以两者输出的3字节Buffer完全相同。
  • base64结果差异最大:base64本质不是明文编码,而是二进制转文本的编码规则,你传入'foo'作为base64参数时,Node.js会把'foo'当做已经被base64编码过的字符串做反向解码得到二进制,而不是把'foo'这三个明文字符编码为base64。按照base64的转换规则,3个base64字符刚好解码为2字节二进制,也就是你看到的<Buffer 7e 8a>。
  • utf16le结果为6字节:UTF-16LE编码对基础平面的字符统一用2字节存储,采用小端序(低位字节在前,高位字节在后)。f的Unicode码点是U+0066,小端存储为66 00,o的Unicode码点是U+006F,小端存储为6f 00,三个字符加起来刚好是6字节,和输出结果一致。

你之前对Buffer的理解完全正确:

Buffer是一块内存区域。
它代表固定大小的内存块,不可调整大小。
你可以将Buffer看做一个整数数组,每个整数代表一个字节的数据。

不同编码转换出来的字节数量、每个字节的取值都不一样,最终生成的Buffer自然会有差异。

内容的提问来源于stack exchange,提问作者nkhil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:57:02