本文节选自《Nodejs学习笔记》,更多章节和更新请访问github主页地址。欢迎加入群交流,群号197339705。模块介绍string_decoder模块用于将Buffer转换成相应的字符串。用户可以通过调用stringDecoder.write(buffer)获取buffer对应的字符串。它的特殊之处在于,当传入的缓冲区不完整时(比如三个字节的字符,只传入两个),内部会维护一个内部缓冲区来缓存不完整的字节,直到用户再次尝试。调用stringDecoder.write(buffer)传入剩余的字节组成一个完整的字符。这样可以有效避免缓冲区不完整导致的错误,对很多场景非常有用,比如网络请求中的包体解析。介绍性示例本节演示两个主要API的用法,分别是decode.write(buffer)和decode.end([buffer])。例1:decoder.write(buffer)调用传入Buffer对象,并返回对应的字符串;constStringDecoder=require('string_decoder').StringDecoder;constdecoder=newStringDecoder('utf8');//Buffer.from('you')=>conststr=decoder.write(Buffer.from([0xe4,0xbd,0xa0]));控制台日志(海峡);//你的例子2:调用decoder.end([buffer])时,会一次性返回剩余的内部buffer。如果此时带上buffer参数,相当于同时调用了decoder.write(buffer)和decoder.end()。constStringDecoder=require('string_decoder').StringDecoder;constdecoder=newStringDecoder('utf8');//Buffer.from('Hello')=>letstr=decoder.write(Buffer.from([0xe4,0xbd,0xa0,0xe5,0xa5]));console.log(str);//你的str=decoder.end(Buffer.from([0xbd]));console.log(str);//好例子:多次写入多个字节以下示例演示了string_decoder模块如何处理多次写入多个字节。首先传入,短1个字节。这时候decoder.write(xx)返回给你。然后,再次调用decoder.write(Buffer.from([0xbd])),传入剩余的1个字节,成功返回。constStringDecoder=require('string_decoder').StringDecoder;constdecoder=newStringDecoder('utf8');//Buffer.from('Hello')=>letstr=decoder.write(Buffer.from([0xe4,0xbd,0xa0,0xe5,0xa5]));console.log(str);//你的str=decoder.write(Buffer.from([0xbd]));console.log(str);//好例子:decoder.end()时,处理decoder.end(buffer)字节数不全时,只传入第一个好字节,然后调用decoder.end(),返回?,对应的buffer为<缓冲区efbfbd>。constStringDecoder=require('string_decoder').StringDecoder;//Buffer.from('good')=>letdecoder=newStringDecoder('utf8');letstr=decoder.end(Buffer.来自([0xe5]));console.log(str);//?console.log(Buffer.from(str));//官方文档对这种情况的解释如下(几乎是废话),大概是约定俗成,当utf8码位无效时,替换为efbfbd。以字符串形式返回存储在内部缓冲区中的任何剩余输入。表示不完整UTF-8和UTF-16字符的字节将被替换为适合字符编码的替换字符。相关链接你应该记得一个UTF-8字符“EFBFBD”http://liudanking.com/golang/...