nodejs調(diào)用python輸出中文亂碼解決方法

在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 顯示亂碼。

解決辦法有以下兩種:

  1. 強(qiáng)制命令行輸出 utf8 編碼的數(shù)據(jù),需要使用chcp 65001命令,參考:http://blog.csdn.net/quzhongxin/article/details/45336333

  2. 使用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)建新的程序都要新加入包= =

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡(jiǎn)介 在編程中常??梢砸?jiàn)到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說(shuō)...
    蘭山小亭閱讀 9,079評(píng)論 0 13
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,603評(píng)論 0 6
  • 幾個(gè)基本概念 bit二進(jìn)制位, 是計(jì)算機(jī)內(nèi)部數(shù)據(jù)儲(chǔ)存的最小單位,11010100是一個(gè)8位二進(jìn)制數(shù)。一個(gè)二進(jìn)制位只...
    西電大俠閱讀 3,703評(píng)論 1 8
  • 藍(lán)海三期啟動(dòng)已經(jīng)有幾天了。我從二期的逃兵,重新列入陣營(yíng)。說(shuō)實(shí)話,自己也不知道準(zhǔn)備好沒(méi)有。只是一股腦的沖了進(jìn)...
    阿蕪閱讀 320評(píng)論 2 3
  • 五更的長(zhǎng)安顯得莊嚴(yán)安謐,朱紅的宮門前站滿了要上早朝的文武百官。有的可能年紀(jì)過(guò)大,略顯疲憊狀;有的是才剛進(jìn)入朝堂的后...
    天之所為閱讀 284評(píng)論 0 0

友情鏈接更多精彩內(nèi)容