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

Node.js child_process.exec在Windows下特殊字符显示为问号的问题

解决Windows下Node.js child_process.exec特殊字符显示问题

这个问题我之前在Windows环境下踩过坑!核心原因是Windows命令提示符(cmd)的默认编码和Node.js用的UTF-8不兼容——Linux终端默认就支持UTF-8,所以特殊字符能正常输出,但Windows cmd通常用CP1252(英文系统)或GBK(中文系统)这类编码,当Node.js以UTF-8读取cmd输出时,就会把特殊字符变成问号。下面是三个实用的解决办法:

方法1:先切换cmd编码到UTF-8

直接在执行目标命令前,通过chcp 65001把cmd的代码页切换成UTF-8,这样输出编码和Node.js一致,特殊字符就能正常显示了:

const { exec } = require('child_process');
try {
  exec("chcp 65001 && echo téstér", function(err, stdout, stderr) {
    // 注意去掉chcp命令输出的"Active code page: 65001"这行
    const result = stdout.split('\n').slice(1).join('\n').trim();
    console.log(result);
  });
} catch(e){
  console.log(e.message);
}

方法2:手动转码处理

如果你不想切换系统编码,可以让Node.js先以二进制buffer的形式读取输出,再用转码工具把Windows编码转成UTF-8。这里需要用到iconv-lite包:

const { exec } = require('child_process');
const iconv = require('iconv-lite');
// 先安装依赖:npm install iconv-lite

try {
  // 指定encoding为buffer,拿到原始二进制数据
  exec("echo téstér", { encoding: 'buffer' }, function(err, stdoutBuffer, stderr) {
    // 英文系统用cp1252,中文系统换成gbk
    const stdout = iconv.decode(stdoutBuffer, 'cp1252');
    console.log(stdout.trim());
  });
} catch(e){
  console.log(e.message);
}

方法3:改用PowerShell执行命令

Windows的PowerShell默认对Unicode支持更好,直接用PowerShell代替cmd执行命令,也能避开编码问题:

const { exec } = require('child_process');
try {
  exec("powershell.exe -Command \"echo téstér\"", function(err, stdout, stderr) {
    console.log(stdout.trim());
  });
} catch(e){
  console.log(e.message);
}

内容的提问来源于stack exchange,提问作者Michael Martellacci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:31:42