1. 程式人生 > >Node.js呼叫cmd輸出中文亂碼

Node.js呼叫cmd輸出中文亂碼

在Windows上使用Node.js通過cmd呼叫別人的exe程式,結果發現輸出中文亂碼,程式碼如下:

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

exec('cmd_test.exe', { encoding: 'utf8' }, (error, stdout) => {
    console.log('stdout1', stdout);
});

exec中的 encoding 選項可用於指定用於解碼 stdout 和 stderr 輸出的字元編碼,其預設值為’utf8’,上面的程式碼中可以省略掉 { encoding: ‘utf8’ } 引數。

但是當輸出中文時 stdout 確實亂碼了。解決辦法有兩種,要麼強制命令列輸出 utf8 編碼的資料,要麼就使用Node去解碼。

對於第二種方法,先將encoding設定為buffer,然後使用iconv-lite模組解碼,程式碼如下:

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

exec('cmd_test.exe', { encoding: 'buffer' }, (error, stdout) => {
    console.log('stdout1'
, iconv.decode(stdout, 'cp936')); })
;

之所以使用cp936解碼,是因為一般簡體中文Windows系統的控制檯一般是這個編碼,這個思路參考自http://ask.csdn.net/questions/167560 ,文中使用的encoding為binary,但實際上在Node v8中,encoding設定為為binary,其stdout也是得到一個buffer。

最後還需要注意的是,程式碼、控制檯輸出,每個環節的編碼出現問題,都有可能導致中文亂碼。當然一般英文不會,utf8、gbk等都是相容ascii(或者說是在ascii的基礎上發展而來)。