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);
});

enter image description here


10 回复

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}`);
});

解释

  1. 创建子进程:

    var ls = spawn('ping', ['www.baidu.com']);
    

    这里我们使用 spawn 方法来启动一个 ping 子进程,并传递参数 www.baidu.com

  2. 处理标准输出:

    ls.stdout.on('data', function (data) {
      console.log('stdout: ' + data.toString('utf-8'));
    });
    

    当子进程有标准输出数据时,会触发 'data' 事件。这里我们将接收到的 Buffer 对象转换为字符串,并指定编码为 utf-8。这样可以确保输出不会出现乱码。

  3. 处理标准错误输出:

    ls.stderr.on('data', function (data) {
      console.error('stderr: ' + data.toString('utf-8'));
    });
    

    类似地,如果子进程有标准错误输出,我们同样需要将其转换为字符串,并指定正确的编码。

  4. 监听子进程退出事件:

    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年前就遇到了这个问题,小弟佩服啊

在使用 child_process.spawn 调用外部命令时,可能会遇到输出内容出现乱码的问题。这通常是因为默认情况下,子进程输出的数据是采用某种编码(如GBK或GB2312)而不是UTF-8编码的。为了正确显示这些数据,你需要将数据从正确的编码转换为UTF-8。

以下是如何解决该问题的示例代码:

const { spawn } = require('child_process');

// 使用spawn方法调用外部命令
const ls = spawn('ping', ['www.baidu.com']);

// 设置正确字符集
ls.stdout.setEncoding('gbk'); // 如果你确定数据是以GBK编码

// 监听stdout事件,并将数据从GBK解码为UTF-8
ls.stdout.on('data', (data) => {
    const decodedData = Buffer.from(data, 'binary').toString('utf8');
    console.log('stdout: ' + decodedData);
});

// 处理stderr
ls.stderr.on('data', (data) => {
    console.error(`stderr: ${Buffer.from(data, 'binary').toString('utf8')}`);
});

// 子进程退出后触发
ls.on('exit', (code) => {
    console.log(`子进程退出,退出码 ${code}`);
});

在这个例子中,我们首先设置ls.stdout的编码为gbk,假设数据是GBK编码的。然后,在处理数据时,我们使用Buffer.from()函数将数据从binary格式转换为utf8格式。这里的关键是确保数据的原始编码与解码时使用的编码匹配,这样才能避免乱码。

请注意,你需要根据实际情况调整字符编码。如果不确定子进程的输出编码是什么,可能需要查阅相关文档或尝试不同的编码方式。

回到顶部