Node.js in Practice 读书笔记 (第三章Buffers 上)

    jwolf 
899  0  0   2016-1-16 8:58


Buffer,其实是系统先分配一定的内存做缓冲区,映射到JavaScript语言中,buffer的属性跟数组类似。比如一些分配一个255字节的buffer,并且把缓冲区的第一个字节设置为23

var buf = new Buffer(255);

buf[0] = 23;

Node中,如果没有明确标明编码,文件、网络的操作都是返回Buffer,比如利用fs说读取文件:

var fs = require('fs');
fs.readFile('./names.txt', function (er, buf) {
  Buffer.isBuffer(buf); // true
});

当然很多情况下我们是知道文件的编码再直接读取到相应编码的字符串的。

fs.readFile(filename,[encoding],[cb])

第二个可选参数是指定相应的编码。

 

利用buffer转换一个string的编码

            正如上面提到,Node很多核心的APIs都会返回buffer,而buffer是很容易转换成其他编码的。这里我们有一个简单的txt文件,读取这个文件并且直接打印buffer:

var fs = require('fs');
  fs.readFile('./names.txt', function (er, buf) {
    console.log(buf);
  });

我们会得到16进制的字节流类似于这样
<Buffer 4a 61 6e 65 74 0a 57 6f 6f 6b 69 65 0a 41 6c 65 78 0a 4d 61 72 63 0a>

当然我们更想得到的是这个:

var fs = require('fs');
  fs.readFile('./names.txt', function (er, buf) {
    console.log(buf.toString());
  });

因为我原来的txt里面都是简单的英文单词(上面没有说明,不过这是前提),都是ASCII字符串,ASCII是比较简单的编码,相对于utf-8会简单,utf-8是当fs.readFile方法中没有指定编码格式的时候的一个缺省编码,指定一个合适的编码能提高转码的效率,毕竟切豆腐的时候没必要用上斧头(好像有个成语,不知道怎么说来的)。这里我们在回调方法中转码:

var fs = require('fs');
fs.readFile('./names.txt', function (er, buf) {
  console.log(buf.toString('ascii'));
});

而利用buffer转码之前,我们可以这样把string通过这样的方法得到buffer:

var buf = new Buffer(authstring);

跟上面类似,Buffer能指定编码,默认也是utf-8,这里的指定编码是第一个参数string原来的编码格式。

new Buffer(string,[encoding])

得到了对应的Buffer对象之后,我们就可以利用上面同样的toString()方法,把他转换成其他编码。