教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Nodejs基础:巧用string_decoder将buffer转成string

Nodejs基础:巧用string_decoder将buffer转成string

发布时间:2021-12-12   编辑:jiaochengji.com
教程集为您提供Nodejs基础:巧用string,decoder将buffer转成string等资源,欢迎您收藏本站,我们将为您提供最新的Nodejs基础:巧用string,decoder将buffer转成string资源
<blockquote>

本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。欢迎加群交流,群号 197339705。

</blockquote> <h2>模块简介</h2>

<code>string_decoder</code>模块用于将Buffer转成对应的字符串。使用者通过调用<code>stringDecoder.write(buffer)</code>,可以获得buffer对应的字符串。

它的特殊之处在于,当传入的buffer不完整(比如三个字节的字符,只传入了两个),内部会维护一个internal buffer将不完整的字节cache住,等到使用者再次调用<code>stringDecoder.write(buffer)</code>传入剩余的字节,来拼成完整的字符。

这样可以有效避免buffer不完整带来的错误,对于很多场景,比如网络请求中的包体解析等,非常有用。

<h2>入门例子</h2>

这节分别演示了<code>decode.write(buffer)</code>、<code>decode.end([buffer])</code>两个主要API的用法。

例子一:

<code>decoder.write(buffer)</code>调用传入了Buffer对象<code><Buffer e4 bd a0></code>,相应的返回了对应的字符串<code>你</code>;

<pre><code class="javascript">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); // 你</code></pre>

例子二:

当<code>decoder.end([buffer])</code>被调用时,内部剩余的buffer会被一次性返回。如果此时带上<code>buffer</code>参数,那么相当于同时调用<code>decoder.write(buffer)</code>和<code>decoder.end()</code>。

<pre><code class="javascript">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); // 好</code></pre> <h2>例子:分多次写入多个字节</h2>

下面的例子,演示了分多次写入多个字节时,<code>string_decoder</code>模块是怎么处理的。

首先,传入了<code><Buffer e4 bd a0 e5 a5></code>,<code>好</code>还差1个字节,此时,<code>decoder.write(xx)</code>返回<code>你</code>。

然后,再次调用<code>decoder.write(Buffer.from([0xbd]))</code>,将剩余的1个字节传入,成功返回<code>好</code>。

<pre><code class="javascript">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); // 好</code></pre> <h2>例子:decoder.end()时,字节数不完整的处理</h2>

<code>decoder.end(buffer)</code>时,仅传入了<code>好</code>的第1个字节,此时调用<code>decoder.end()</code>,返回了<code>�</code>,对应的buffer为<code><Buffer ef bf bd></code>。

<pre><code class="javascript">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></code></pre>

官方文档对于这种情况的解释是这样的(跟废话差不多),大约是约定俗成了,当<code>utf8</code>码点无效时,替换成<code>ef bf bd</code>。

<blockquote>

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.

</blockquote> <h2>相关链接</h2>

你应该记住的一个UTF-8字符「EF BF BD」
http://liudanking.com/golang/...

到此这篇关于“Nodejs基础:巧用string_decoder将buffer转成string”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Nodejs基础:巧用string_decoder将buffer转成string
支持多语言的微服务框架Tars-Go
php nodeJs thrift协议,实现zookeeper节点数据自动发现
php可以快速上手吗
javaScript 依赖管理
java实现在不同编码之间进行文件转换程序
php生成静态html文件的三种方法
学php能找到工作吗?
golang 面试
photoshop基础常用对齐技巧心得分享一览

[关闭]
~ ~