昨天运行Java项目又出现了麻烦的中文乱码问题,我就去网上搜相关的解决办法。一个接一个尝试后还是没有用,最后折腾了一天,想出了一个还可以的解决办法。所有的过程记录如下:
网上的常规办法
- 保证源代码文件、配置文件本身的编码为UTF-8(就是IDEA右下角显示的编码)
- 保证IDEA使用UTF-8编码读取文件(文件->设置->编辑器->文件编码,把全局编码、项目编码、属性文件的默认编码全部都改成UTF-8)
- 保证IDEA使用的字体没有缺少中文字库(包含外观字体和编辑器字体)
- 保证Java程序以UTF-8编译或运行

- 保证Gradle以UTF-8编译或运行

上面的办法都试过之后还是没有解决问题。首先我猜测运行的整个流程是“读取java源代码->编译运行输出->gradle读取输出->IDEA控制台读取显示”,那么用排除法,有问题的部分只能是“gradle输出和IDEA控制台读取”。
那么就能猜测是不是gradle输出的时候,检测到Windows的默认编码为GBK,所以又把编码转成GBK扔给控制台了,然后控制台又以UTF-8编码读取,最后显示出来就是乱码。
因为我找不到设置gradle输出编码的方法,于是就从控制台入手:
外部调用gradle.bat
- 在build.gradle中指定程序入口

在项目的根目录创建Powershell脚本,更改控制台读取编码为GBK,调用gradle.bat运行项目
chcp 936 > $null # 更改控制台编码 & "D:\WEB\gradle\gradle-8.13\bin\gradle.bat" run pause运行结果

此时乱码问题解决了,说明确实是gradle中转的时候,把编码转成GBK扔给控制台了。
在IDEA集成Shell脚本
- 在IDEA中添加新的运行配置,选择Shell

- 填写配置名称和脚本路径

这样子就把刚刚写的Powershell脚本集成到IDEA中了(可以把脚本中的pause删去了)
- 最终效果

总结
最好的解决办法还是设置gradle的输出编码。主要是程序入口要在build.gradle另外设置,不方便调试。还有就是一些特殊字符(比如emoji☝️🤓)本身就不支持GBK,转码会丢失这些字符或者变成乱码。
各位如果觉得有用请点击下方的打赏,扫描二维码给我投币,创作不易,感谢支持!