이 글에서는Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
string_decoder
모듈은 Buffer를 해당 문자열로 변환하는 데 사용됩니다. 사용자는stringDecoder.write(buffer)
를 호출하여 버퍼에 해당하는 문자열을 얻을 수 있습니다. [추천 학습: "nodejs tutorialstring_decoder
模块用于将Buffer转成对应的字符串。使用者通过调用stringDecoder.write(buffer)
,可以获得buffer对应的字符串。【推荐学习:《nodejs 教程》】
它的特殊之处在于,当传入的buffer不完整(比如三个字节的字符,只传入了两个),内部会维护一个internal buffer将不完整的字节cache住,等到使用者再次调用stringDecoder.write(buffer)
传入剩余的字节,来拼成完整的字符。
这样可以有效避免buffer不完整带来的错误,对于很多场景,比如网络请求中的包体解析等,非常有用。
这节分别演示了decode.write(buffer)
、decode.end([buffer])
两个主要API的用法。
例子一:
decoder.write(buffer)
调用传入了Buffer对象
,相应的返回了对应的字符串你
;
const StringDecoder = require('string_decoder').StringDecoder; const decoder = new StringDecoder('utf8'); // Buffer.from('你') =>const str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0])); console.log(str); // 你
例子二:
当decoder.end([buffer])
被调用时,内部剩余的buffer会被一次性返回。如果此时带上buffer
参数,那么相当于同时调用decoder.write(buffer)
和decoder.end()
。
const StringDecoder = require('string_decoder').StringDecoder; const decoder = new StringDecoder('utf8'); // Buffer.from('你好') =>let str = 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个字节传入,成功返回好
。
const StringDecoder = require('string_decoder').StringDecoder; const decoder = new StringDecoder('utf8'); // Buffer.from('你好') =>let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5])); console.log(str); // 你 str = decoder.write(Buffer.from([0xbd])); console.log(str); // 好
decoder.end(buffer)
时,仅传入了好
的第1个字节,此时调用decoder.end()
,返回了�
,对应的buffer为
。
const StringDecoder = require('string_decoder').StringDecoder; // Buffer.from('好') =>let decoder = new StringDecoder('utf8'); let str = decoder.end( Buffer.from([0xe5]) ); console.log(str); // � console.log(Buffer.from(str)); //
官方文档对于这种情况的解释是这样的(跟废话差不多),大约是约定俗成了,当utf8
码点无效时,替换成ef bf bd
"]
특별합니다 요점은 들어오는 버퍼가 불완전할 때(예를 들어 3바이트 문자 중 2개만 전달되는 경우) 사용자가
stringDecoder.write(buffer를 호출할 때까지 내부 버퍼가 내부적으로 유지되어 불완전한 바이트를 캐시한다는 것입니다. )
나머지 바이트를 전달하여 완전한 문자를 입력합니다.
이것은 불완전한 버퍼로 인한 오류를 효과적으로 방지할 수 있으며 네트워크 요청의 패키지 본문 구문 분석과 같은 많은 시나리오에 매우 유용합니다.
decode.write(buffer)
및
decode.end([buffer])/를 보여줍니다. code>두 가지 주요 API의 사용. 예 1: