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
相关产品推荐
相关产品推荐

