最近在用node处理屏蔽字的时候需要读取一个文件,原本编码是utf8,但是拿到的屏蔽字编码是gbk,所以需要对编码进行转换,服务器是linux。var illelg = fs.readFileSync(filePath).split('\r\n');
这是之前读取的utf8文件,结尾是'^M$' 也就是换行回车,拿到的gbk也是按照这个结尾的,分割('\r\n')是没问题的,但是我用webstorm转码了,把gbk编码转成utf8,在linux打开的时候就只剩下'$',然后在分割的时候会有问题,split('\n');
unix(或linux)系统中,每行结尾只有换行\n,windows中每行的结尾是\n\r,MAC中每行的结尾只有\r,所以在windows里打开unix、mac中的文件,所有的文字会变成一行,而windows里的文件在unix/mac打开的话,在每行的结尾可能会多一个^M符号
关于换行的问题可以看这篇文章:
http://www.cnblogs.com/xiaotiannet/p/3510586.html
主要说的是编码问题,把gbk转码成utf8,需要用到一个模块iconv。
fs文件系统用readFileSync读取文件的时候,如果不指定编码,会返回一个buffer实例,或者也可以加'binary',buffer实例就是二进制的,可以转换其他的编码,不过buffer支持转换的对象没有gbk。
ascii
utf8
utf16le:UTF-16的小端编码,支持大于U+10000的四字节字符。
ucs2:utf16le的别名。
base64
hex:将每个字节转为两个十六进制字符。
所以需要用到iconv模块。
var iconv = require('iconv-lite')
然后将读取到的文件转换,上面读取屏蔽字文件按照行分割,对于不同系统分割也有不同,需要在转码之后在分割,开始分割会是一个数组:
var fs = require('fs');
var iconv = require('iconv-lite');
var fsread = fs.readFileSync(filePath/*,'binary'*/);
var result = iconv.decode(fsread,'gbk');
对于fs会或读取到一个buffer实例,如果其他方式获取到的不是buffer实例,可以转一下
new Buffer(str,'binary');
node中的buffer可以看一下api文档。
更多关于node处理gbk的可以看这篇文章:
http://fengmk2.github.io/blog/2014/iconv-lite/iconv-lite.html