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头,即可解决该问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~