VS Code task使用c/c++extension(cppbuild)类型运行windows命令在终端输出乱码解决办法

VS Code的task的type字段设置为extension定义的类型时,运行一个windows命令,可能会在终端输出输出乱码,例如:

			"type":"cppbuild",//c/c++ extension定义的task类型.
			"command": "chcp 65001" //windows命令

如果这样配置,会在终端输出中文乱码.
根本原因是task的type配置成了c/c++ extension重载的任务类型,该名称可以在该插件的package.json文件中的contributes{taskDefinitions…}找到.
当启动task时, c/c++ extension调用Node.js的child_process.exec()启动windows命令,而exec()函数不支持中文编码gbk,所以才输出中文乱码.
有网友建议修改注册表,将终端编码改为utf8,这种方法可以解决部分问题.大家可以自行搜索.
但是有些命令比如vs2010的link.exe命令,貌似只输出gbk编码的中文,即使终端修改为utf8编码仍然会输出中文乱码.
这里提供一种修改c/c++ extension源代码的办法,来解决中文字符乱码问题.
1.先安装iconv-lite: npm install iconv-lite -g
2.打开文件:C:\Users\Administrator.vscode\extensions\ms-vscode.cpptools-1.2.2\dist\main.js(记得修改之前先备份.).
3.搜索cppbuild,在下面的位置添加一行代码:var iconv = require(…)

//这里的iconv-lite采用默认安装路径.
var iconv = require("C:/Users/Administrator/AppData/Roaming/npm/node_modules/iconv-lite");//添加
exports.CppBuildTaskProvider = CppBuildTaskProvider; //源码
CppBuildTaskProvider.CppBuildScriptType = 'cppbuild'; //源码
CppBuildTaskProvider.CppBuildSourceStr = "C/C++"; //源码

4.找到class CustomBuildTaskTerminal类的成员函数dobuild(){…}中的下面这个调用的上添加一行:

this.options.encoding = "binary"; //添加
cp.exec(activeCommand, this.options, (_error, stdout, _stderr) => {...}//源码

cp.exec()的最后一个参数是函数,注意这里的3个形参_error,stdout,_stderr就是在终端输出的内容.在该函数中找到如下几个调用:

splitWriteEmitter(_error.message);
...
splitWriteEmitter(stdout);
...
splitWriteEmitter(_stderr);

分别修改为:

var buferr = Buffer.from(_error.message, "binary");
splitWriteEmitter(iconv.decode(buferr, 'cp936'));
...
var bufstdout = Buffer.from(stdout, "binary");
splitWriteEmitter(iconv.decode(bufstdout, 'cp936'));
...
var bufstderr = Buffer.from(_stderr, "binary");
splitWriteEmitter(iconv.decode(bufstderr, 'cp936'));

最后,重启VS Code.再次运行task,会发现中文字符正常输出.

这里需要注意一点:
在函数(_error, stdout, _stderr) => {…}中调用Buffer.from(…)之前,需要先判断3个参数是否为true.否则会导致内存错误.

版本:
VS Code 1.53.0
使用的c/c++ extension 1.2.2
iconv-lite 0.6.2

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值