在Windows上使用Node.js通过cmd调用别人的exe程序,结果发现输出中文乱码,代码如下:
const { exec } = require('child_process');
exec('ping 127.0.0.1', { encoding: 'utf8' }, (error, stdout) => {
console.log('stdout1', stdout);
});
exec中的 encoding 选项可用于指定用于解码 stdout 和 stderr 输出的字符编码,其默认值为’utf8’,上面的代码中可以省略掉 { encoding: ‘utf8’ } 参数。
但是当输出中文时 stdout 确实乱码了。
解决办法有两种:
- 要么强制命令行输出 utf8 编码的数据
- 要么就使用Node去解码。
对于第一种方法,需要使用chcp 65001命令,参考:http://blog.csdn.net/quzhongxin/article/details/45336333
对于第二种方法,先将encoding设置为buffer,然后使用iconv-lite模块解码,代码如下:
const iconv = require('iconv-lite');
const { exec } = require('child_process');
exec('cmd_test.exe', { encoding: 'buffer' }, (error, stdout) => {
console.log('stdout1', iconv.decode(stdout, 'cp936'));
});
之所以使用cp936解码,是因为一般简体中文Windows系统的控制台一般是这个编码,这个思路参考自http://ask.csdn.net/questions/167560 ,文中使用的encoding为binary,但实际上在Node v8中,encoding设置为为binary,其stdout也是得到一个buffer。
最后还需要注意的是,代码、控制台输出,每个环节的编码出现问题,都有可能导致中文乱码。当然一般英文不会,utf8、gbk等都是兼容ascii(或者说是在ascii的基础上发展而来)。
转载至CSDN,原文地址: https://blog.csdn.net/liuyaqi1993/article/details/78723797?utm_source=blogxgwz32