专栏首页IMWeb前端团队Nodejs基础:巧用string_decoder将buffer转成string

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

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载

模块简介

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

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

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

入门例子

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

例子一:

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

例子二:

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

首先,传入了<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/utf-8_replacement_character/

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

    IMWeb前端团队
  • 【推荐】机不可失!直播技术盛宴,深圳2017腾讯Live开发者大会震撼来袭

    本文作者:IMWeb NumerHero 原文出处:IMWeb社区 未经同意,禁止转载 ? 腾讯Live开发者大会(TLC)是由腾讯NOW直播IVW...

    IMWeb前端团队
  • Iconfont在教育平台的实践

    本文作者:IMWeb bleanycao 原文出处:IMWeb社区 未经同意,禁止转载 Iconfont 体系化解决方案 背景 性能优化是前端开发不得...

    IMWeb前端团队
  • Nodejs基础:巧用string_decoder将buffer转成string

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

    IMWeb前端团队
  • 网络排查工具MTR介绍

    常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合ping ns...

    苏欣
  • 运维总监不会告诉你这些有趣但鲜为人知的 Linux 命令

    在这篇文章中和 Carla Schroder 一起探索 Linux 中的一些鲜为人知的强大工具。 本文是一篇关于一些有趣但鲜为人知的工具 termsaver、p...

    小小科
  • Codeforces Round #512 Div. 2 A,B,C Vasya and Golden Ticket

    题目链接:http://codeforces.com/contest/1058/problem/A

    Ch_Zaqdt
  • 2014百度研发真题及其解析-求比指定数大且最小的“不重复数”

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄
  • 【中英文视频】人工智能自动驾驶技术为卡车司机带来更轻松的行车生活

    卡车司机开着车,将大部分货物运到美国各地。漫长的行车时间、满足在线订单的需求日渐增高,还要冒险在暴风雪及高峰时段里行驶,压力非同小可。

    GPUS Lady
  • 精准测试及其工具(连载3)

    1,将星云提供的lanyuan_v_3.sql导入到数据库中(右键新建lanyuan_v_3),如图29所示。

    小老鼠

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动