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

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

模块简介

string_decoder模块用于将Buffer转成对应的字符串。使用者经过调用stringDecoder.write(buffer),能够得到buffer对应的字符串。java

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

这样能够有效避免buffer不完整带来的错误,对于不少场景,好比网络请求中的包体解析等,很是有用。git

入门例子

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

例子一:golang

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

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);  // 你

例子二:app

decoder.end([buffer])被调用时,内部剩余的buffer会被一次性返回。若是此时带上buffer参数,那么至关于同时调用decoder.write(buffer)decoder.end()ide

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模块是怎么处理的。学习

首先,传入了<Buffer e4 bd a0 e5 a5>还差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()时,字节数不完整的处理

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

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

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.

相关连接

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

相关文章
相关标签/搜索