이 글에서는 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对象4906621e4f28d4de4703165e1c48080e
,相应的返回了对应的字符串你
;
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); // 你
例子二:
当decoder.end([buffer])
被调用时,内部剩余的buffer会被一次性返回。如果此时带上buffer
参数,那么相当于同时调用decoder.write(buffer)
和decoder.end()
。
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.end(Buffer.from([0xbd])); console.log(str); // 好
下面的例子,演示了分多次写入多个字节时,string_decoder
模块是怎么处理的。
首先,传入了efba047232e9c30493e472f2bf6fc120
,好
还差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); // 好
decoder.end(buffer)
时,仅传入了好
的第1个字节,此时调用decoder.end()
,返回了�
,对应的buffer为bc19c5c32cd20c3c3f2e331d6251d270
。
const StringDecoder = require('string_decoder').StringDecoder; // Buffer.from('好') => <Buffer e5 a5 bd> let decoder = new StringDecoder('utf8'); let str = decoder.end( Buffer.from([0xe5]) ); console.log(str); // � console.log(Buffer.from(str)); // <Buffer ef bf bd>
官方文档对于这种情况的解释是这样的(跟废话差不多),大约是约定俗成了,当utf8
码点无效时,替换成ef bf bd
"]
특별합니다 요점은 들어오는 버퍼가 불완전할 때(예를 들어 3바이트 문자 중 2개만 전달되는 경우) 사용자가 stringDecoder.write(buffer를 호출할 때까지 내부 버퍼가 내부적으로 유지되어 불완전한 바이트를 캐시한다는 것입니다. )
나머지 바이트를 전달하여 완전한 문자를 입력합니다. 이것은 불완전한 버퍼로 인한 오류를 효과적으로 방지할 수 있으며 네트워크 요청의 패키지 본문 구문 분석과 같은 많은 시나리오에 매우 유용합니다.
decode.write(buffer)
및 decode.end([buffer])/를 보여줍니다. code>두 가지 주요 API의 사용. <p></p>예 1: <p><a href="https://www.php.cn/course.html" target="_blank" textvalue="编程视频"> <code>decoder.write(buffer)
호출은 Buffer 객체 4906621e4f28d4de4703165e1c48080e
를 전달하고 이에 따라 해당 문자열이 반환됩니다You;rrreee예제 2:🎜🎜decoder.end([buffer])
호출 시 남은 내부 버퍼를 한번에 반환합니다. 이때 buffer
매개변수를 가져오면 decoder.write(buffer)
, decoder.end()
를 호출하는 것과 같습니다. 같은 시간. 🎜rrreeestring_decoder
모듈이 처리되는 방식을 보여줍니다. 🎜🎜먼저 efba047232e9c30493e472f2bf6fc120
가 전달됩니다. Good
은 이때 여전히 1바이트가 부족합니다. )는 당신
을 반환합니다. 🎜🎜그런 다음 decoder.write(Buffer.from([0xbd]))
를 다시 호출하고 나머지 1바이트를 전달한 후 Good
을 성공적으로 반환합니다. 🎜rrreeedecoder.end(buffer)
, good
의 첫 번째 바이트가 전달됩니다. 이때 decoder.end()
가 호출되고 해당 버퍼가 반환됩니다. 8a7690cd30bf38768ffb3bf3dacc5f30. 🎜rrreee🎜공식 문서에서는 이 상황을 다음과 같이 설명합니다(거의 말도 안 되는 내용과 유사함). 이는 대략적인 관례입니다. utf8
코드 포인트가 유효하지 않은 경우 이를 ef bf bd
로 바꾸세요. >. 🎜🎜🎜내부 버퍼에 저장된 나머지 입력을 문자열로 반환합니다. 불완전한 UTF-8 및 UTF-16 문자를 나타내는 바이트는 문자 인코딩에 적합한 대체 문자로 대체됩니다.🎜🎜🎜🎜관련 링크🎜🎜🎜 UTF-8 문자 "EF BF BD"를 기억하세요 http://liudanking.com/golang/utf-8_replacement_character/🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜위 내용은 Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!