在Windows下使用child_process spawn或exec时编码错误

时间:2013-12-22 17:03:01

标签: windows node.js

在Windows CMD中使用dir命令将产生以下输出:

Verzeichnis von D:\workspace\filewalker

22.12.2013  17:27    <DIR>          .
22.12.2013  17:27    <DIR>          ..
22.12.2013  17:48               392 test.js
22.12.2013  17:23                 0 testöäüÄÖÜ.txt
22.12.2013  17:27    <DIR>          testÖÄÜöüäß
2 Datei(en),            392 Bytes
3 Verzeichnis(se), 273.731.170.304 Bytes frei

使用execspawn会产生以下结果:

Verzeichnis von D:\workspace\filewalker

22.12.2013  17:27    <DIR>          .
22.12.2013  17:27    <DIR>          ..
22.12.2013  17:48               392 test.js
22.12.2013  17:23                 0 test������.txt
22.12.2013  17:27    <DIR>          test�������
2 Datei(en),            392 Bytes
3 Verzeichnis(se), 273.731.170.304 Bytes frei

这是我的节点代码:

var exec = require('child_process').exec,
    child;

child = exec('dir',
  function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

3 个答案:

答案 0 :(得分:5)

我设法通过在exec命令开始时添加cmd /c chcp 65001>nul &&(此命令将cmd的控制台输出设置为utf-8)来修复它,因此您看起来像cmd /c chcp 65001>nul && dir,它应该可以工作。 / p>

如果您编写跨平台的文档,可以使用process.platform来确定何时需要它,诸如此类:

var cmd = "";
if (process.platform === "win32") { 
  cmd += "cmd /c chcp 65001>nul && "; 
};
cmd += "dir";

child = exec(cmd, //...
  • 即使dir命令不是“跨平台”的。

答案 1 :(得分:1)

来自http://www.nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

  

有第二个可选参数指定多个选项。

是默认选项
{ encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null }

Node默认为utf8,而Windows为不同的语言版本提供不同的代码页。

答案 2 :(得分:1)

我通过以下代码解决了它(简体中文),不知道其他语言的编码页面,也许您可​​以在Microsoft网站上找到它:

  const encoding          = 'cp936';
  const binaryEncoding    = 'binary';

  function iconvDecode(str = '') {
      return iconv.decode(Buffer.from(str, binaryEncoding), encoding);
  }

  const  { exec } = require('child_process');  
  exec('xxx', { encoding: 'binary' }, (err, stdout, stderr) => {
        const result = iconvDecode(stdout);
        xxx
  });