Node.js中npm脚本传参的编码异常问题求助
问题背景
在Windows系统中,通过npm脚本传递带特殊字符的文件路径参数:
--pathToFile=./ESMM/Parametrização_Dezembro_PS1_2022.xlsx
使用Node.js的process.argv获取参数后,出现编码异常:
./ESMM/Parametrização_Dezembro_PS1_2022.xlsx
尝试转码为latin1后仍无法得到正确结果:
./ESMM/Parametriza?º?úo_Dezembro_PS1_2022.xlsx
已知环境:package.json为UTF-8编码,终端活动代码页为850(chcp查询结果)。
根本原因
Windows终端默认采用OEM编码(如代码页850),而Node.js在Windows平台默认以UTF-8解析process.argv参数。npm传递参数时会按终端当前编码处理,导致原本的UTF-8特殊字符被错误解析,后续转码操作无法恢复原字符。
可行解决方案
方案1:临时切换终端编码为UTF-8
在运行npm脚本前,先将终端编码切换为UTF-8(代码页65001),确保参数传递时使用UTF-8编码:
chcp 65001 && npm run your-script-name
此方法无需修改代码,Node.js可直接通过process.argv获取正确编码的路径字符串。
方案2:Node.js代码内反向转码适配OEM编码
若无法修改终端编码,可借助iconv-lite库完成编码转换:
- 安装依赖:
npm install iconv-lite --save
- 修改代码实现转码:
const iconv = require('iconv-lite'); // 获取参数 const value = process.argv.find(element => element.startsWith(`--pathToFile=`)); const pathToFile = value.replace(`--pathToFile=`, ''); // 反向转码:将错误解析的UTF-8字符串转为CP850编码,再解码为UTF-8 const correctPath = iconv.decode(iconv.encode(pathToFile, 'utf8'), 'cp850'); console.log(correctPath); // 输出正确路径
原理:终端用CP850编码传递参数,Node.js误将其当作UTF-8解析,因此先将错误字符串转回CP850编码的Buffer,再以UTF-8解码即可还原原字符。
方案3:使用cross-env统一编码(跨平台友好)
安装cross-env实现跨平台的环境变量与编码配置:
- 安装依赖:
npm install cross-env --save-dev
- 修改
package.json中的脚本:
{ "scripts": { "your-script": "cross-env chcp 65001 && node your-entry-file.js" } }
运行脚本时会自动切换终端编码为UTF-8,无需手动执行chcp命令。
验证转码正确性
可通过打印字符的十六进制值验证:
console.log(Buffer.from(correctPath).toString('hex'));
正确结果中,ç对应十六进制c3a7,ã对应c3a3,若输出包含这两个值则转码成功。
内容的提问来源于stack exchange,提问作者H.C

