10月19, 2017

node模块之string_decoder

最近刚好看到这个模块,记录一下。

string_decoder 模块提供了一个 API,用于把 Buffer 对象解码成字符串,但会保留编码过的多字节 UTF-8 与 UTF-16 字符。

可能这样说,有点不是太清楚。举个实例吧。

譬如我们都知道一个中文汉字是3个字节。

const test1 = Buffer.from("中");
console.log(test1.byteLength);

但如果我们不知道呢,比如要实现一个buffer的拷贝,代码如下:

const buf = Buffer.from("中文字符串!");

for(let i = 0; i < buf.length; i += 3) {
    const b = Buffer.allocUnsafe(3);
    buf.copy(b, 0, i);

    console.log(b.toString());
}

上面的结果肯定没问题,因为一个中文就是3个字节,那假如将上面的3改成2呢?

const buf = Buffer.from("中文字符串!");

for(let i = 0; i < buf.length; i += 2) {
    const b = Buffer.allocUnsafe(2);
    buf.copy(b, 0, i);

    console.log(b.toString());
}

alt

将2改成5,得到的结果:

alt

下面来试试stringDecoder吧。

const StringDecoder = require("string_decoder").StringDecoder;
const decoder = new StringDecoder("utf8");

const buf = Buffer.from("中文字符串!");

for(let i = 0; i < buf.length; i += 2) {
    const b = Buffer.allocUnsafe(2);
    buf.copy(b, 0, i);

    console.log(decoder.write(b));
}

alt

可以注意到的是一开始有一个空格,这是因为两个字节拼不成一个汉字,然后它会和下次的内容结合起来。

本文链接:www.my-fe.pub/post/node-stringDecoder.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。