LeoYuan / leoyuan.github.io

This is my blog repo.
http://leoyuan.github.io
17 stars 2 forks source link

NodeJS读取GBK文件,写入GBK文件 #21

Open LeoYuan opened 10 years ago

LeoYuan commented 10 years ago

问题

NodeJS并不支持以GBK的方式来读取文件,只能以UTF-8方式读取,或者不解码成任何编码格式,直接以字节流返回,这时在读取文件后发现所有中文数据都变成了乱码,写入一个新文件也是一堆乱码。

解决方案

一句话概括解决此类乱码问题就是在读取入口和写入出口进行编码转换。

具体步骤:

  1. 以不进行任何编码的方式来读取本地文件或HTTP文件,返回原生Buffer。
  2. 使用iconv-lite来将读取到的Buffer按照GBK编码方式来解码,代码如下:
var iconv = require('iconv-lite');  // iconv-lite是纯js实现的编码转化工具,速度比iconv更快!
var utf8Str = iconv.decode(buf, 'GBK'); 

返回的utf8Str是个UTF-8的字符串,因为JS所有字符串都是UTF-8编码的!!! 所谓按照GBK来转码,只是按照GBK的解码方式来读取buf的内容,得到正确的GBK内容后再转化成UTF-8编码的字符串。我们之所以看到乱码,是因为用UTF-8的解码方式去尝试解码一段GBK的字节流。

  1. 使用utf8Str来进行你的业务逻辑的处理。
  2. 将utf8Str编码成GBK格式的字节流,代码如下:
var gbkBuffer = iconv.encode(utf8Str, 'GBK');

全部代码

var through2 = require('through2');
var fs = require('fs');
var iconv = require('iconv-lite');

fs.createReadStream('./test/style_test/a.js')
  .pipe(through2(function (chunk, enc, callback) {

    var jsUTF8Str = iconv.decode(chunk.contents, 'GBK');

    // 处理jsUTF8Str

    var gbkBuffer = iconv.encode(jsUTF8Str, 'GBK');
    chunk.contents = gbkBuffer;
    this.push(chunk);

    callback();
  }))
  .pipe(fs.createWriteStream('out.js'));

更多资料

  1. http://www.smallni.com/character-encoding/