Node.js呼叫cmd輸出中文亂碼
阿新 • • 發佈:2019-01-01
在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的基礎上發展而來)。