在Windows上使用Node.js調(diào)用python,并將結(jié)果返回nodejs輸出,結(jié)果輸出中文出現(xiàn)了亂碼,英文結(jié)果正常。nodejs調(diào)用python代碼如下:
var exec = require('child_process').exec;
var arg;
exec('python test.py '+arg, { encoding: 'utf8' }, function(error,stdout,stderr){
if(stdout.length >1)
{
console.log('you offer args:',stdout);
} else
{
console.log('you don't offer args');
}
if(error)
{
console.info('stderr : '+stderr);
}
});
exec中的 encoding 選項(xiàng)用于指定stdout 和 stderr 輸出的字符編碼形式,其默認(rèn)值為’utf8’,上面代碼中 { encoding: ‘utf8’ } 可省略。
上述代碼運(yùn)行時(shí)調(diào)用python文件test.py,輸出英文時(shí)stdout正常,但是當(dāng)輸出中文時(shí) stdout 顯示亂碼。
解決辦法有以下兩種:
強(qiáng)制命令行輸出 utf8 編碼的數(shù)據(jù),需要使用chcp 65001命令,參考:http://blog.csdn.net/quzhongxin/article/details/45336333
使用Node解碼,先將encoding設(shè)置為buffer,然后使用iconv-lite模塊解碼,代碼如下:
const iconv = require('iconv-lite');//解碼包,解決中文亂碼問(wèn)題
var exec = require('child_process').exec;
var startFlag = 'True';
exec('python test.py '+ startFlag, { encoding: 'buffer' }, function(error,stdout,stderr){
if(stdout.length >1)
{
var out= iconv.decode(stdout, 'cp936');
console.log('you offer args:',out);
} else
{
console.log('you don't offer args');
}
if(error)
{
console.info('stderr : '+stderr);
}
});
cp936編碼與GBK類似,簡(jiǎn)體中文Windows系統(tǒng)的控制臺(tái)一般是這個(gè)編碼,因此用cp936解碼。
注意:使用iconv-lite模塊前需要在本程序文件夾中的node_modules文件夾中添加iconv-lite包和safer-buffer包,這樣才能正確運(yùn)行,否則會(huì)報(bào)錯(cuò)。我還不能理解為什么nodejs的包管理設(shè)計(jì)的這么復(fù)雜,每次創(chuàng)建新的程序都要新加入包= =