根据客户须要开发了一个先后端程序,大概流程以下: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操做文件构建稍微复杂点的程序,踩了不少坑,这篇文章主要针对过程当中的编码问题简单介绍。也是第一回在思否发稍微长点的文章,文笔粗糙,各位不喜勿喷。