环境
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也没有出现问题,看来是把这个小问题给修复了。~~~~