# Buffer的拼接

Buffer的使用场景中,通常是以一段一段的方式传输。

# 可能出现的问题

当输入流中有宽字节编码时,可能会出现异常问题。 例如中文在utf-8占3个字节,当读取流有字节限制时,可能并不能按3的倍数的数读取,所以读取最终显示可能会出错。

# setEncoding() 和 string_decoder()

setEncoding()方法让data事件中传递的是编码后的字符串,而不是一个Buffer对象。
在调用该方法时,可读流对象子啊内部设置了一个decoder对象。decoder来自string_decoder模块StringDecoder的实例对象 StringDecoder得到编码后,根据字符串在设置的编码下存储方式来存储并灵活调用,但setEncoding()并不能处理所有编码方式。

StringDecoder在得到编码后,知道宽字节字符串在UTF-8编码下是以3个字节的方式存储的,所以第一次write()时,只输出前9个字节转码形成的字符,“月”字的前两个字节被保留在StringDecoder实例内部。第二次write()时,会将这2个剩余字节和后续11个字节组合在一起,再次用3的整数倍字节进行转码。于是乱码问题通过这种中间形式被解决了

# 正确拼接Buffer

正确的拼接方式为把多个小Buffer拼接成一个Buffer对象,通过用一个数组来存储所有Buffer片段并记录总长度,然后通过Buffer.concat()合并为一个Buffer对象

  var chunks = [];
        var size = 0;
        res.on('data', function (chunk) {
          chunks.push(chunk);
          size += chunk.length;
        });
        res.on('end', function () {
          var buf = Buffer.concat(chunks, size);
          var str = iconv.decode(buf, 'utf8');
          console.log(str);
        });