中文乱码我相信每一个程序员都会遇到这种问题。
但有时候我们按照网上教程去设置,确实编码好了,但是有时候按照教程来却没能达到我们的预期。
在此之前我将所有编码都设置成了UTF-8,文件编码,项目编码,尝试(最终不需要配启动参数)
启动参数也加了
-Dconsole.encoding=UTF-8
-Dfile.encoding=UTF-8
将idea所有设置好后,我们可以看到配置文件所有编码相关的都是UTF-8,也就是settings里设置的那些。
运行环境jdk18/jdk23
起初以为是jdk的问题,所有试过2个jdk,结果与开头第一张截图类似。
运行环境JDK23:遇到一个非常奇怪的问题,将project的编码设置为GBK后(其他所有配置都为UTF-8),开始出现部分中文乱码。
可以看到json里面的开篇词
中文没出现乱码
正式讲解解决编码问题
我期望所有的编码都使用UTF-8
场景分析:将全部编码设置为UTF-8,运行程序后控制台打印的是乱码。
如下,File Encodings
可以很容易推断出
- 肯定在某个地方存在编码转换,导致了乱码
作为程序员唯一能做的事情就是debug,通过debug System.out.println()
去看看是哪里的编码不一致。
下面跟着我一起debug看下代码,测试代码如下:
public static void main(String[] args) throws Exception {System.out.println("课程信息:");
}
debug前,需要和我一样,将上面那几个位置(文件编码,控制台编码
)设置为UTF-8
然后编译一下项目,确保编译后的 .class
文件与设置的编码一样,可以idea看下编译后的文件中文是否是正常的显示
通过review代码,可以推测就是这行out.write(cb,0,nextChar)
执行完后,控制台就显示打印的信息的(因为后面没有代码了,所以肯定这行-这个时候我们就可以看下out对象内部的属性
)
出现乱码的原因:
很明显看到一个GBK
的属性,这个时候我们就重点关注这段代码,然后看下这个cs属性为GBK
的是否是我们控制台中文乱码的原因。
很明显应该就是了
解决乱码
问题找出后,解决自然就简单了,只需要将cs属性的编码设置为UTF-8
按道理就可以解决控制台乱码的问题
cs全称应该是Char Set
我们要更新这个cs属性,那么肯定是在创建这个cs的时候就该设置为UTF-8
,继续找下cs在什么时候赋值的,然后看下能不能更新字符集。
通过代码review,并没有找到可以直接更新上述字符集编码的方法。
System
这个java类看起来是jvm底层内部提供好的。
通过询问AI,发现可以使用new PrintStream(System.out, true, "UTF-8")
,然后找了下api,发现有setOut方法,于是问题解决
main函数加入下面这个可以解决问题
PrintStream printStream = new PrintStream(System.out, true, "UTF-8");
System.setOut(printStream);