根据客户需求开发了一个前后端程序。大致流程如下:双击start.cmd启动nodejs服务器;用户在网页填写一些参数,提交给后台;后端使用nodejs接收前端参数,然后根据参数重写服务端的配置文件;然后使用require('child_process').spawn在服务器上调用批处理脚本;脚本中调用ANSYS的可执行文件compute.bat进行3D模型数据的计算和转换;可执行文件compute.bat在执行过程中,会输出一些运行提示文字到一个临时文件temp.dat中,提示文字包含中文;使用nodejs监听临时文件的变化,并从中提取提示文本;使用WebSocket将这些提示文字推送到前端,然后由前端显示在界面上。start.cmd执行:网页参数:临时文件temp.dat内容:客户端收到WebSocket报文后显示如下:整个过程中,链接1、7、8中有汉字。启动nodejs服务器的命令提示窗口Title,运行过程中打印的提示文字;compute.bat执行期间输出到temp.dat的文本;nodejs读取的temp.dat中的文本。首先,start.cmd、compute.bat、temp.dat文件本身都有对应的编码,这些批处理文件中保存的编码会影响输出文本的编码。首先,start.cmd是我自己创建的,编码是UTF-8。双击打开文件后,文件内容@ECHOOFFtitle启动服务器节点./index.jspause双击start.cmd时,调用cmd.exe命令提示符执行里面的脚本,命令prompt本身也有自己的编码方式,可以输入chcp命令查看:activecodepage:936936表示命令提示符使用的GBK编码方式,以及start.cmd文件使用的UTF-8,这两个不一致导致乱码,所以解决方法是保持两者一致,两种修改方法:start.cmd以GBK编码重新保存;修改命令提示符的编码方式为UTF-8,传送门-设置CMD默认代码页为65001或936。这时候双击start.cmd,标题就会正常显示了。由于compute.bat是客户提供的,而temp.dat是compute.bat生成的,所以这两个编码是一致的,都是ANSI(ANSI是Windows特有的,严格来说不能叫编码类型,传送门——ANSI是什么编码?)。ANSI在国内一般是GBK编码。使用nodejs读取temp.dat内容时,由于temp.dat是GBK编码的,所以有如下代码:varfs=require("fs");variconv=require('iconv-lite');varresult=fs.readFileSync("temp.dat","binary");vartext=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');constbat=spawn('cmd.exe',['/c',"compute.bat"],{encoding:"buffer"});bat.stderr.on('data',(stderr)=>{varerrStr=iconv.decode(Buffer.from(stderr,"binary"),"GBK");console.error(errStr);});bat.on('exit',(code)=>{if(code===0){//正常退出cb();}else{cb({code:code});}});由于是第一次使用nodejs运行文件搭建稍微复杂一点的程序,踩了不少坑。本文主要介绍过程中的编码问题。也是第一次在四物上发稍微长一点的文章,文笔比较粗糙,不喜勿喷。
