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
相关产品推荐
相关产品推荐

