Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환

青灯夜游
풀어 주다: 2021-05-14 11:00:36
앞으로
2618명이 탐색했습니다.

이 글에서는Nodejs의 string_decoder 모듈을 사용하여 버퍼를 문자열로 변환하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

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()时,字节数不完整的处理

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:

decoder.write(buffer)호출은 Buffer 객체 를 전달하고 이에 따라 해당 문자열이 반환됩니다You

;rrreee예제 2: decoder.end([buffer])호출 시 남은 내부 버퍼를 한번에 반환합니다. 이때 buffer매개변수를 가져오면 decoder.write(buffer), decoder.end()를 호출하는 것과 같습니다. 같은 시간. rrreee

예: 여러 바이트를 여러 번 쓰기다음 예는 여러 바이트를 여러 번 쓸 때string_decoder모듈이 처리되는 방식을 보여줍니다. 먼저가 전달됩니다.Good은 이때 여전히 1바이트가 부족합니다. )는당신을 반환합니다. 그런 다음decoder.write(Buffer.from([0xbd]))를 다시 호출하고 나머지 1바이트를 전달한 후Good을 성공적으로 반환합니다. rrreee

예: decoder.end() 시 바이트 수가 불완전합니다.decoder.end(buffer),good의 첫 번째 바이트가 전달됩니다. 이때decoder.end()가 호출되고 해당 버퍼가 반환됩니다. <버퍼 ef bf bd> . 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!