Nodejs 在 win下child_process模块的exec 返回乱码的问题

Nodejs 在 win下child_process模块的exec 返回乱码的问题

首先按照 iconv-lite 模块 ’npm install iconv-lite’ 先上代码吧: ’‘String.prototype.each=function(i,fun){ var index=0; var that=this; while(index<=that.length){ (fun||function(){})(that.substr(index,i)) index+=i; } } var exec=require(‘child_process’).exec; var iconv=require(’./iconv-lite’); exec(‘ipconfig /all’,{encoding:‘hex’},function(e,r){ var arr=[]; r.each(2,function(data){ arr.push(parseInt(data,16));
}); console.log(iconv.decode(new Buffer(arr), ‘GBK’)) });’’ 1 首先把输出的为hex编码的字符串 2 然后把hex 转换为 buffer 3 用iconv-lite 模块把buffer 用gbk模式输出

ps:如果大家有什么好的方法 请告诉我


4 回复

Nodejs 在 Windows 下 child_process 模块的 exec 返回乱码的问题

问题描述

在使用 Node.js 的 child_process 模块执行外部命令时(例如 ipconfig /all),在 Windows 系统中,返回的结果经常会出现乱码。这通常是因为默认的编码与系统预期的编码不匹配。

解决方案

为了解决这个问题,我们可以使用 iconv-lite 模块将返回的编码转换为正确的格式(如 GBK)。

示例代码

const { exec } = require('child_process');
const iconv = require('iconv-lite');

// 执行外部命令并获取结果
exec('ipconfig /all', { encoding: 'binary' }, (error, result) => {
    if (error) {
        console.error(`执行错误: ${error}`);
        return;
    }

    // 将结果转换为 Buffer,并使用 iconv-lite 进行解码
    const buffer = Buffer.from(result, 'binary');
    const decodedText = iconv.decode(buffer, 'GBK');

    // 输出解码后的文本
    console.log(decodedText);
});

代码解释

  1. 导入模块

    • child_process 模块用于执行外部命令。
    • iconv-lite 模块用于处理字符编码。
  2. 执行外部命令

    • 使用 exec 方法执行 ipconfig /all 命令。
    • 设置 { encoding: 'binary' } 以确保返回的数据不会被自动解码。
  3. 处理返回结果

    • 将返回的二进制数据转换为 Buffer 对象。
    • 使用 iconv-lite 模块的 decode 方法将 Buffer 对象解码为 GBK 编码的字符串。
  4. 输出结果

    • 最终输出解码后的文本,避免乱码问题。

总结

通过这种方式,我们能够有效地解决在 Windows 系统中使用 Node.js 的 child_process.exec 方法执行外部命令时出现的乱码问题。希望这个解决方案对你有所帮助!如果你有其他更好的方法,请分享一下。


‘markdom’ 失败

String.prototype.each=function(i,fun){
  var index=0;
  var that=this;
  while(index<=that.length){
    (fun||function(){})(that.substr(index,i))
      index+=i;
  }
}
var exec=require('child_process').exec;
var iconv=require('./iconv-lite');
exec('ipconfig /all',{encoding:'hex'},function(e,r){
   var arr=[];
   r.each(2,function(data){
       arr.push(parseInt(data,16));
   });
   console.log(iconv.decode(new Buffer(arr), 'GBK'))
});

在 Windows 下使用 Node.js 的 child_process 模块执行命令时,可能会遇到返回值为乱码的问题。这通常是由于字符编码不匹配导致的。例如,默认情况下 exec 可能会将输出以某种默认编码返回,而不是我们期望的 GBK 编码。

你可以通过安装并使用 iconv-lite 模块来解决这个问题。下面是一个改进后的示例代码,展示了如何正确地解码返回的输出:

示例代码

const { exec } = require('child_process');
const iconv = require('iconv-lite');

// 执行命令并捕获输出
exec('ipconfig /all', { encoding: 'binary' }, (error, stdout, stderr) => {
    if (error) {
        console.error(`执行出错: ${error}`);
        return;
    }

    // 将输出从二进制转换为 Buffer,并使用 GBK 解码
    const buffer = Buffer.from(stdout, 'binary');
    const decodedOutput = iconv.decode(buffer, 'GBK');

    console.log(decodedOutput);
});

解释

  1. 设置 encoding: 'binary': 这样可以确保输出不会被自动解码为 Unicode 字符串。
  2. 将输出转换为 Buffer: 使用 Buffer.from(stdout, 'binary') 将输出转换为 Buffer 对象。
  3. 使用 iconv-lite 解码: 使用 iconv.decode 方法将 Buffer 对象解码为字符串,指定编码为 'GBK'

这样可以确保你能够正确地处理和显示 Windows 命令行工具(如 ipconfig)的输出,避免乱码问题。

安装依赖

确保已经安装了 iconv-lite 模块,可以使用以下命令安装:

npm install iconv-lite

以上就是解决 Windows 下 child_process.exec 返回乱码问题的方法。希望对你有所帮助!

回到顶部