Nodejs child_process.spawn 乱码问题?
Nodejs child_process.spawn 乱码问题?
var ls= require(‘child_process’).spawn(‘ping’, [‘www.baidu.com’]);
ls.stdout.on(‘data’, function (data) {
console.log('stdout: ’ + data);
});
Node.js child_process.spawn
乱码问题
在使用 Node.js 的 child_process.spawn
方法执行外部命令时,可能会遇到输出结果出现乱码的问题。这通常是由于字符编码不匹配导致的。
示例代码
假设我们要执行一个 ping
命令,并处理其标准输出:
const { spawn } = require('child_process');
// 创建子进程并执行 ping 命令
var ls = spawn('ping', ['www.baidu.com']);
// 监听 stdout 数据事件
ls.stdout.on('data', function (data) {
// 将 Buffer 转换为字符串,并指定正确的编码
console.log('stdout: ' + data.toString('utf-8'));
});
// 监听 stderr 数据事件(如果有错误信息)
ls.stderr.on('data', function (data) {
console.error('stderr: ' + data.toString('utf-8'));
});
// 监听子进程退出事件
ls.on('exit', function (code) {
console.log(`子进程退出,退出码 ${code}`);
});
解释
-
创建子进程:
var ls = spawn('ping', ['www.baidu.com']);
这里我们使用
spawn
方法来启动一个ping
子进程,并传递参数www.baidu.com
。 -
处理标准输出:
ls.stdout.on('data', function (data) { console.log('stdout: ' + data.toString('utf-8')); });
当子进程有标准输出数据时,会触发
'data'
事件。这里我们将接收到的Buffer
对象转换为字符串,并指定编码为utf-8
。这样可以确保输出不会出现乱码。 -
处理标准错误输出:
ls.stderr.on('data', function (data) { console.error('stderr: ' + data.toString('utf-8')); });
类似地,如果子进程有标准错误输出,我们同样需要将其转换为字符串,并指定正确的编码。
-
监听子进程退出事件:
ls.on('exit', function (code) { console.log(`子进程退出,退出码 ${code}`); });
当子进程退出时,会触发
'exit'
事件。通过监听此事件,我们可以获取到子进程的退出状态码。
总结
在使用 child_process.spawn
时,确保正确处理输出数据的编码非常重要。默认情况下,Node.js 可能会将接收到的数据作为 Buffer
对象返回,因此我们需要明确指定编码格式(如 utf-8
),以避免乱码问题。
中文Windows控制台是GBK编码的,应该需要转换为UTF-8: https://github.com/ashtuchkin/iconv-lite
纯Js呐,这是个好东西
var buffer = new Buffer(data);
var str = iconv.decode(buffer, 'gbk');
为什么没有 ls.stdout..on 'end'
…
非关键代码,就没贴上来
不知道怎么获取终端的编码。貌似Linux一般都是UTF-8的,只有Windows才是ANSI编码,而且若终端输出的是英文字符,用哪个编码方式都是可以正常显示的。 如果是这样的话,简单地判断一下操作系统类型吧
怎么样只取命令输出的前面几行,比如1行或者2
6飞 大佬们6年前就遇到了这个问题,小弟佩服啊