NodeJS中Buffer与字符串相互转换时⼀个值得注意的问题
什么问题
如果⼀个Buffer的toString()结果为乱码或含有乱码,那么⽤此字符串以Buffer.from()⽅法构造出来的Buffer将与原来的Buffer不相同。
这⼀点其实很好理解,只是很多和我⼀样的初学者在使⽤时可能并不会意识到这⼀点。
⽤代码演⽰的话如下:
let buf = Buffer.from([0x5a,0x6b,0x8c,0x7d,0x9e]);
console.String());
console.log(buf);
let buf1 = Buffer.String());
console.log(buf1);
console.log(buf1.equals(buf));
//运⾏结果如下
/*
Zk�}�
<Buffer 5a 6b 8c 7d 9e>
<Buffer 5a 6b ef bf bd 7d ef bf bd>
false
*/
怎样解决
但是多数情况下我们并不能到⼀种合适的编码格式,⽐如当buf是来⾃⼀个图⽚的⼆进制数据时,所以最好的⽅法还是尽量避免这种操作...补充
Node.js 当前⽀持的字符编码如下:
'utf8': 多字节编码的 Unicode 字符。许多⽹页和其他⽂档格式都使⽤ UTF-8。这是默认的字符编码。当将 Buffer 解码为不
专门包含有效 UTF-8 数据的字符串时,则会使⽤ Unicode 替换字符 U+FFFD �来表⽰这些错误。
'utf16le': 多字节编码的 Unicode 字符。与 'utf8' 不同,字符串中的每个字符都会使⽤ 2 个或 4 个字节进⾏编码。 Node.js 仅
⽀持 UTF-16 的⼩端序变体。
'latin1': Latin-1 代表 ISO-8859-1。此字符编码仅⽀持从 U+0000 到 U+00FF 的 Unicode 字符。每个字符使⽤单个字节进⾏
编码。超出该范围的字符会被截断,并映射成该范围内的字符。
'base64': Base64 编码。当从字符串创建 Buffer 时,此编码也会正确地接受 RFC 4648 第 5 节中指定的 “URL 和⽂件名安全
字母”。 base64 编码的字符串中包含的空格字符(例如空格、制表符和换⾏)会被忽略。
nodejs字符串转数组
'hex': 将每个字节编码成两个⼗六进制的字符。当解码仅包含有效的⼗六进制字符的字符串时,可能会发⽣数据截断。请参
见下⾯的⽰例。
'ascii': 仅适⽤于 7 位 ASCII 数据。当将字符串编码为 Buffer 时,这等效于使⽤ 'latin1'。当将 Buffer 解码为字符串时,则使
⽤此编码会在解码为 'latin1' 之前额外取消设置每个字节的最⾼位。通常,当在编码或解码纯 ASCII ⽂本时,应该没有理由
使⽤这种编码,因为 'utf8'(或者,如果已知的数据始终为纯 ASCII,则为 'latin1')会是更好的选择。这仅为传统的兼容性
⽽提供。
'binary': 'latin1' 的别名。有关此编码的更多背景,请参阅⼆进制字符串。该编码的名称可能会引起误解,因为此处列出的所
有编码都是在字符串和⼆进制数据之间转换。对于在字符串和 Buffer 之间进⾏转换,通常 'utf-8' 是正确的选择。
'ucs2': 'utf16le' 的别名。 UCS-2 以前是指 UTF-16 的⼀种变体,该变体不⽀持代码点⼤于 U+FFFF 的字符。在 Node.js
中,始终⽀持这些代码点。
如有错误欢迎指正!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。