Nodejs基础:巧⽤string_decoder将buffer转成string
本⽂摘录⾃《Nodejs学习笔记》,更多章节及更新,请访问 。欢迎加流,号 。
模块简介
string_decoder模块⽤于将Buffer转成对应的字符串。使⽤者通过调⽤stringDecoder.write(buffer),可以获得buffer对应的字符串。
它的特殊之处在于,当传⼊的buffer不完整(⽐如三个字节的字符,只传⼊了两个),内部会维护⼀个internal buffer将不完整的字节cache住,等到使⽤者再次调⽤stringDecoder.write(buffer)传⼊剩余的字节,来拼成完整的字符。
这样可以有效避免buffer不完整带来的错误,对于很多场景,⽐如⽹络请求中的包体解析等,⾮常有⽤。
⼊门例⼦
这节分别演⽰了decode.write(buffer)、d([buffer])两个主要API的⽤法。
例⼦⼀:
decoder.write(buffer)调⽤传⼊了Buffer对象<Buffer e4 bd a0>,相应的返回了对应的字符串你;
const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');
// Buffer.from('你') => <Buffer e4 bd a0>
const str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0]));
console.log(str);  // 你
例⼦⼆:
当d([buffer])被调⽤时,内部剩余的buffer会被⼀次性返回。如果此时带上buffer参数,那么相当于同时调
⽤decoder.write(buffer)和d()。
const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');
// Buffer.from('你好') => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你decoder
str = d(Buffer.from([0xbd]));
console.log(str);  // 好
例⼦:分多次写⼊多个字节
下⾯的例⼦,演⽰了分多次写⼊多个字节时,string_decoder模块是怎么处理的。
⾸先,传⼊了<Buffer e4 bd a0 e5 a5>,好还差1个字节,此时,decoder.write(xx)返回你。
然后,再次调⽤decoder.write(Buffer.from([0xbd])),将剩余的1个字节传⼊,成功返回好。
const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');
/
/ Buffer.from('你好') => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你
str = decoder.write(Buffer.from([0xbd]));
console.log(str);  // 好
例⼦:d()时,字节数不完整的处理
const StringDecoder = require('string_decoder').StringDecoder;
// Buffer.from('好') => <Buffer e5 a5 bd>
let decoder = new StringDecoder('utf8');
let str = d( Buffer.from([0xe5]) );
console.log(str);  // �
console.log(Buffer.from(str));  // <Buffer ef bf bd>
官⽅⽂档对于这种情况的解释是这样的(跟废话差不多),⼤约是约定俗成了,当utf8码点⽆效时,替换成ef bf bd。
Returns any remaining input stored in the internal buffer as a string. Bytes representing incomplete UTF-8 and UTF-16 characters will be replaced with substitution characters appropriate for the character encoding.
相关链接

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