根據客戶須要開發了一個先後端程序,大概流程以下:html
start.cmd執行:
前端
web頁面參數:
node
臨時文件temp.dat內容:
web
客戶端收到WebSocket消息後展現如:
後端
整個流程中,一、七、8環節都有中文字符服務器
首先,start.cmd、compute.bat、temp.dat文件自己有相應的編碼,這些批處理文件保存的編碼會影響輸出文本的編碼。ui
首先start.cmd是我用建立的,編碼爲UTF-8,雙擊文件打開後,
文件內容編碼
@ECHO OFF title 啓動服務器 node ./index.js pause
雙擊start.cmd時,是調用了cmd.exe命令提示符執行裏面的腳本,而命令提示符自己也有本身的編碼方式,能夠輸入chcp命令查看:
spa
活動代碼頁: 936
936就表示命令提示符使用的GBK編碼方式,而start.cmd文件使用的UTF-8,兩者不一致致使了亂碼,因此解決的方式就是使兩者保持一致,兩種修改方式:.net
此時,雙擊start.cmd,標題就正常顯示了
因爲compute.bat是客戶提供的,temp.dat是compute.bat生成的,這兩個編碼是一致的,都是ANSI(ANSI是Windows獨有的,嚴格來講不能稱之爲編碼類型,傳送門——ANSI是什麼編碼?)。ANSI在國內通常就是GBK編碼。
在使用nodejs讀取temp.dat內容的時候,因爲temp.dat是GBK編碼,因此有以下代碼:
var fs = require("fs"); var iconv = require('iconv-lite'); var result = fs.readFileSync("temp.dat", "binary"); var text = iconv.decode(Buffer.from(result, "binary"), "GBK"); console.log("【原有內容】" + text);
nodejs自己不支持GBK,這裏用到了iconv-lite模塊來從讀取到的Buffer以GBK方式解碼,結果正常展現:
這裏,有三個地方的編碼須要保持一致:temp.dat、nodejs處理的編碼方式、命令提示符的編碼,不然展現在控制檯的中文就會亂碼。
因爲temp.dat是compute.bat腳本生成的,而compute.bat腳本文件自己以何種編碼方式保存會影響輸出的編碼,這一點也是不能忽略的。
另外,compute.bat執行過程發生的錯誤,若是nodejs捕獲到了,也是須要使用GBK方式進行解碼的:
var {spawn } = require('child_process'); const bat = spawn('cmd.exe', ['/c', "compute.bat"], { encoding: "buffer" }); bat.stderr.on('data', (stderr) => { var errStr = iconv.decode(Buffer.from(stderr, "binary"), "GBK"); console.error(errStr); }); bat.on('exit', (code) => { if (code === 0) { // 正常退出 cb(); } else { cb({ code: code }); } });
因爲第一次使用nodejs操做文件構建稍微複雜點的程序,踩了不少坑,這篇文章主要針對過程當中的編碼問題簡單介紹。也是第一回在思否發稍微長點的文章,文筆粗糙,各位不喜勿噴。