在Windows上使用Node.js通過cmd調(diào)用別人的exe程序逃魄,結(jié)果發(fā)現(xiàn)輸出中文亂碼荤西,代碼如下:
const { exec } = require('child_process');
exec('ping 127.0.0.1', { encoding: 'utf8' }, (error, stdout) => {
console.log('stdout1', stdout);
});
exec中的 encoding 選項(xiàng)可用于指定用于解碼 stdout 和 stderr 輸出的字符編碼,其默認(rèn)值為’utf8’伍俘,上面的代碼中可以省略掉 { encoding: ‘utf8’ } 參數(shù)邪锌。
但是當(dāng)輸出中文時(shí) stdout 確實(shí)亂碼了。
解決辦法有兩種:
- 要么強(qiáng)制命令行輸出 utf8 編碼的數(shù)據(jù)
- 要么就使用Node去解碼癌瘾。
對(duì)于第一種方法秃流,需要使用chcp 65001命令,參考:http://blog.csdn.net/quzhongxin/article/details/45336333
對(duì)于第二種方法柳弄,先將encoding設(shè)置為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解碼碧注,是因?yàn)橐话愫嗴w中文Windows系統(tǒng)的控制臺(tái)一般是這個(gè)編碼嚣伐,這個(gè)思路參考自http://ask.csdn.net/questions/167560 ,文中使用的encoding為binary萍丐,但實(shí)際上在Node v8中轩端,encoding設(shè)置為為binary,其stdout也是得到一個(gè)buffer逝变。
最后還需要注意的是基茵,代碼、控制臺(tái)輸出壳影,每個(gè)環(huán)節(jié)的編碼出現(xiàn)問題拱层,都有可能導(dǎo)致中文亂碼。當(dāng)然一般英文不會(huì)宴咧,utf8根灯、gbk等都是兼容ascii(或者說是在ascii的基礎(chǔ)上發(fā)展而來)。
轉(zhuǎn)載至CSDN掺栅,原文地址: https://blog.csdn.net/liuyaqi1993/article/details/78723797?utm_source=blogxgwz32