vscode 运行java 乱码_VScode中运行Java程序出现乱码

在Win7环境下,使用VSCode和JavaExtensionPack插件开发Java程序时遇到了中文乱码问题。作者发现Java默认UTF-8编码与系统GBK编码不一致导致此问题。通过修改VSCode的launcher.bat文件取消字符编码转换以及调整launch.json文件配置,解决了乱码问题。在Linux和Win10系统中未重现该问题,推测Win7可能存在相关小bug。
摘要由CSDN通过智能技术生成

环境

HP的台式机,EliteDesk,系统是Win7家庭版。 JDK为adopt openjdk 1.8版。 编辑器是VSCode+Java Extension Pack插件。

问题

编写如下程序:

public class test002{

public static void main(String[] args) {

String s="中文测试";

System.out.println(s+"\n");

System.out.println(s);

}

}

单击main方法上面的run按钮(应该是Debugger for Java提供的),运行结果是:

中文测试

�测试

中文测试��测试�试��

出现了乱码,而且是在正常输出中文信息之后再出现乱码。基本可以判断,这和文字编码有关

思考

Java默认支持的是UTF-8字符编码,而中文Windows支持的是GBK字符编码,这两者是不同的,因此会导致字符乱码。VSCode编辑器默认使用UTF-8保存文件。 所以,如果是自己输入命令的,那么,可以这样编译: javac -encoding utf-8 test002.java

test002.java是待编译的源文件名 执行时可使用命令: java -Dfile.encoding=utf-8 test002

然而,这是在jdk工具中的操作方法。VSCode显然没有采用这个方法,它的插件使用了另一种方法。打开文件C:\Users\hp\.vscode\extensions\vscjava.vscode-java-debug-0.24.0\scripts\launcher.bat,里面的内容是:

@echo off

REM Change code page to UTF-8 for better compatibility.

@chcp.com 65001 > NUL

REM Execute real command passed by args

%*

这个批处理文件的关键是这一句:@chcp.com 65001 > NUL,它的作用是将命令行工具的默认字符编码改成UTF-8。

看似一切都没有问题。

解决

我想起以前用Sublime Text编辑器时,也遇到过类似问题,无论怎么改配置文件,中文就是不能正常显示,直到指定使用GBK字符编码显示。 所以,我修改了launcher.bat的内容:

@echo off

REM Change code page to UTF-8 for better compatibility.

REM @chcp.com 65001 > NUL

REM Execute real command passed by args

%*

把@chcp.com 65001 > NUL这句注释掉了,也就是不会修改命令行工具的字符编码。 结果再没有出过问题。

推测

因为没有找到更进一步的资料,只能推测一下,这可能是Win 7中的命令行工具的一个小bug,可能是从执行一个程序到在VSCode的终端中显示出来这个过程中的某个环节出了问题,导致最终显示时还是使用了GBK编码。 因为我修改过VSCode中的launch.json文件,这是负责加载、运行或者调试Java程序的配置文件,在其中加入了:encoding":"gbk",以便使用GBK编码。修改后这里和上面提到的命令行工具的字符编码这两个地方后,输出没有问题。 后来我把launch.json文件中修改的这一项删掉,输出依然没有问题。基本可以判定,整个过程中某个环节,很可能就是运行Java程序的时候,还是使用了GBK编码,而非UTF-8编码。

后续

后来我在Linux(neon kde,基于Ubuntu 18.04)和win10专业版中都进行了同样的实验,没有出现问题。 Linux一直默认使用UTF-8,肯定没有问题。Win10也没有出现问题,看来是把这个小问题给修复了。~~~~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值