You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中npm脚本传参的编码异常问题求助

解决Windows下npm脚本传递含特殊字符路径的Node.js编码问题

问题背景

在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库完成编码转换:

  1. 安装依赖:
npm install iconv-lite --save
  1. 修改代码实现转码:
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实现跨平台的环境变量与编码配置:

  1. 安装依赖:
npm install cross-env --save-dev
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:45:30