Node.js中Buffer调用toString后utf8编码还原数据不一致问题求解
问题成因
UTF-8 是可变长编码,仅支持特定范围的字节序列,当 Buffer 中存在不符合 UTF-8 编码规则的字节时,buffer.toString('utf8') 操作会自动将这些非法字节替换为 Unicode 替换字符 �(U+FFFD),这个过程是不可逆的信息丢失,因此直接用 Buffer.from(str, 'utf8') 无法还原出原始 Buffer。
你遇到的“还原后的 Buffer 调用 toString 结果和原始字符串一致”的现象也很好解释:� 本身是合法的 Unicode 字符,二次转换时不会被修改,因此字符串结果始终一致,但原始字节信息已经在第一次 toString 操作中永久丢失。
解决方案
分两种场景处理:
- 如果你可以调整原始 Buffer 转字符串的编码逻辑
放弃使用默认的 UTF-8 编码,选择支持任意字节无损转换的编码格式,推荐两种方案:- 使用 base64 编码
// 序列化阶段 const bufferString = buffer.toString('base64') // 反序列化阶段 const originBuffer = Buffer.from(bufferString, 'base64')- 使用 latin1(别名 binary)编码
latin1 编码的每个字节直接对应一个 Unicode 码点,映射关系一一对应,不会出现信息丢失:
// 序列化阶段 const bufferString = buffer.toString('latin1') // 反序列化阶段 const originBuffer = Buffer.from(bufferString, 'latin1') - 如果你仅能拿到已经通过 UTF-8 编码生成的字符串,无法修改之前的转换逻辑
没有任何方案可以还原出原始 Buffer,因为非法字节对应的原始信息已经被不可逆替换为统一的替换字符,无法回溯原始值。
内容的提问来源于stack exchange,提问作者Ben Gooding
相关产品推荐
相关产品推荐

