js脚本实现文本文件格式批量转换

问题:

在Windows环境下,从某些软件中导出的文本格式的数据,选择了默认的ANSI格式。双击打开数据文件后,一切正常,没乱码问题。但是为什么自己的代码里,先按照ANSI格式打开,在转换为UTF8,然后解析入库,最后却发现乱码了。

解答:

代码很简单,先说一下原因。

1. 直接打开数据文件后,一切正常,没乱码问题啊?

首先,要知道ANSI肯定无法表示汉字字符集,所以直接用记事本查看时,没有发生乱码,这期间一定发生了什么。

既然ANSI无法表示汉字字符集,那么里面的汉字为什么能正常显示?这就涉及到操作系统的默认编码了,也就是代码页信息。

查看方法:

C:\>chcp

活动代码页:936

此时,936即是GBK字符集在Windows系统中的代号。另外,65001即UTF8。

所以,某些软件中的默认格式ANSI实际上是当前操作系统的“活动代码页:xxx”中xxx所代表的编码格式。你以为他是ANSI,实际上他是GBK。

注意:.Net Framework 中 System.Text.Encoding.Default 属性返回的对象,是根据活动代码页而创建相应的对象。而 .NET Core 中则始终返回 UTF8Encoding。

2. 格式转换代码

var fs = require('fs')
var path =  require('path')
var iconv = require('iconv-lite')

var ascpath = "D:/2022"
var utfpath = "D:/2022-utf"
fs.readdir(ascpath,(err,files)=>{
    if(err){
        console.log(err)
        return;
    }
   files.forEach(file=>{
       fs.createReadStream(path.join(ascpath,file))
       .pipe(iconv.decodeStream('gbk'))
       .pipe(iconv.decodeStream('utf8'))
       .pipe(fs.createWriteStream(path.join(utfpath,file)))
   })
   // 如果想加上 BOM 头 '\ufeff'
    /*  
    files.forEach(file=>{
        let bytes = fs.readFileSync(path.join(ascpath,file))
        bytes = iconv.decode(bytes,'gbk') // 先用 gbk 解码
        let bom_bytes= '\ufeff' + bytes.toString('utf-8') //再用utf-8编码
        fs.writeFileSync(path.join(utfpath,file),bom_bytes)
    })
    */ 
})

 3. 补充

问:node.js生成的csv文件用记事本打开时没有乱码,Excel中却乱码,该怎么办?明明nodejs的默认编码是utf8呀,支持中文呀?

答:写入时加入BOM头,即可解决该问题。

posted @ 2022-09-14 14:57  神棍二叔  阅读(497)  评论(0编辑  收藏  举报