本文适用于Windows,Linux中应该不会出现这种问题。
前几天由于要写OJ题我又打开了尘封已久的VSCode Java工作区,使用过程中遇到了中文乱码的问题,照理说应该是不会出现这种问题的,因为我当初在配置Java环境的时候就已经解决了中文乱码的问题。然后一直懒得修,直到今天有空。
博主我原先是将JDK的编码和Java文件的编码都设置为GBK,这样在运行的时候就不会出现中文乱码的问题,不知从那个版本开始这种方式就不可行了,于是只能重新的测试。
测试用的代码如下:
// encoding: GBK package Test; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; class Test { public static void main(String[] args) throws UnsupportedEncodingException { System.out.println("Default Charset=" + Charset.defaultCharset()); System.out.println("file.encoding=" + System.getProperty("file.encoding")); System.out.println("Default Charset=" + Charset.defaultCharset()); System.out.println("Default Charset in Use=" + getDefaultCharSet()); System.out.println("你好世界"); } private static String getDefaultCharSet() { OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream()); String enc = writer.getEncoding(); return enc; } }
launch.json的配置如下:
{ "type": "java", "name": "CodeLens (Launch) - Algorithm", "request": "launch", "cwd": "${workspaceFolder}", "console": "integratedTerminal", "encoding": "GBK", // 设置为JDK为GBK "stopOnEntry": false, "mainClass": "${fileBasenameNoExtensio.${fileBasenameNoExtension}", "args": "" }
这是原本的解决方案,运行后可以看到中文(你好世界)并没有输出:
通过chcp命令查询字符集,发现终端的字符集使用的是UTF-8:
将字符集全部java文件的编码和launch.json的encoding更改为UTF-8后出现乱码:
这个编码是UTF-8转为GBK造成的,如果我们将文件更改为GBK编码呢?
从上面可以看到终端正确输出了中文,但是这个方案并不是很好,如果你需要将代码转移到Linux等基于UTF-8编码的系统中就会发现代码需要重新转编码才能继续使用,那如果我们将文件设置为UTF-8编码,而encoding设置为GBK呢?
可以看到终端也成功出现了中文,而文件也不用更改为GBK编码,上传到Git上或者Linux系统中就不会出现乱码的问题了。
注意:如果console设置为internalConsole则需要使用第一种方式,即文件使用GBK,encoding设置为UTF-8。