问题复现
使用spawn()执行一个系统命令时控制台出现乱码
/**
* @description TODO
* @author suiyue
* @date 2019/9/6 16:01
*/
var spawn = require('child_process').spawn;
const iconv = require("iconv-lite");
var options ={
env:{user:'brad'},
detached:false,
stdio:['pipe','pipe','pipe']
};
var child = spawn('netstat',['-e']);
child.stdout.on('data', function (data) {
console.log(data.toString());
});
child.stderr.on('data', function (data) {
console.log(data.toString());
});
child.on('exit', function (code) {
console.log('Child exited with code', code);
});
问题显示
解决思路
简体中文windows命令行,都使用的是CP936(近似于gb2312)编码,nodejs以utf8识别是会出问题。
可以这样处理:
先用binary来存储输出的文本,再用iconv来以cp936解析。
转自 cyrilluce 的回复
https://ask.csdn.net/questions/167560
实现办法
/**
* @description TODO
* @author suiyue
* @date 2019/9/6 16:01
*/
var spawn = require('child_process').spawn;
const iconv = require("iconv-lite");
var options ={
env:{user:'brad'},
detached:false,
stdio:['pipe','pipe','pipe']
};
var child = spawn('netstat',['-e']);
child.stdout.on('data', function (data) {
// 合并数组生成 buff 对象
// 转编码,保持跟响应一致
console.log(iconv.decode(Buffer.from(data, 'binary'), 'cp936'));
//console.log(data.toString());
});
child.stderr.on('data', function (data) {
console.log(iconv.decode(Buffer.from(data, 'binary'), 'cp936'));
//console.log(data.toString());
});
child.on('exit', function (code) {
console.log('Child exited with code', code);
});