编码和换行

本文讨论了Unix/Linux、Windows和Mac系统中换行符的不同,指出Windows文件在Unix或Mac系统中显示为一行,反之则可能显示^M符号。提到了在处理编码转换,尤其是GBK到UTF-8时,可以使用iconv模块。同时提到在Node.js的fs模块中,未指定编码读取文件将返回Buffer实例,可用于编码转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在用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里打开unixmac中的文件,所有的文字会变成一行,而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









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值