首页 > 其他分享 >关于IDEA控制台中文乱码问题

关于IDEA控制台中文乱码问题

时间:2024-06-12 16:31:26浏览次数:25  
标签:编码 UTF encoding IDEA 乱码 设置 字符 控制台

最近我正在尝试把JDK8升级到JDK21。

我新建了一个Sping Boot 3.3.0的项目,SDK设置为Oracle OpenJDK 21.0.2,并在main方法中写了一个简单的 System.out.println(“你好,世界”) ,运行后得到一串乱码。按照JDK8的经验,我检查了IDEA的相关配置:

1. File->Settings有关encoding的选项已经是UTF-8

2. Help->Edit Custom VM Options中已经添加了-Dfile.encoding=UTF-8

都正确,咋还是报错呢?我在网上找了好久,终于找到一个靠谱的解决办法,在Run->Edit Configurations里,增加VM Options: -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8,再次运行,问题解决。

作为一个严谨的Java程序员,知其然,也要知其所以然,在经过一番研究后得出如下结论。先说解决方案(需要提前说明的是,为了兼容既有项目,我的IDEA还是用JDK8启动的):

1. JDK17及以前:在Custom VM Options中增加-Dfile.encoding=UTF-8

2. JDK18:在Run->Edit Configurations中增加VM Options: -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8

3. JDK19到JDK21:在Run->Edit Configurations中增加VM Options: -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8

再说原因

1. 乱码

众所周知,计算机世界是构建在二进制也就是0和1之上的。我们能读懂的字符也是按照既定规则用一连串的0和1来表示的,这个既定规则就是字符编码。字符编码有很多,我们常见的有ASCII、GBK、GB2312和UTF-8等。按照这些规则把字符转换为0和1的过程叫编码,反之叫解码。如果我们使用某种规则编码,却使用另一种规则解码时,可能会出现找不到或找错对应字符的情况,就会显示一些我们读不懂的字符,也就是乱码。

2. 流程及编码设置

既然乱码是由于编解码所用规则不一致导致的,那就需要统一编码。下图是从编写代码到运行的大概流程:

其中涉及编解码的地方:

① 编写代码并存储到.java文件,这里的字符编码需要在开发工具里设置,在IDEA里边就是File ->Settings下有关encoding的选项;

② Java编译器读取.java文件,可以通过javac -encoding UTF-8来设置字符编码,如果不设置,就使用操作系统的。如果用Gradle等构建工具,虽然有设置方法,但一般用不到;

③ Java编译完成后,生成.class文件,这里的编码不可设置,按Java虚拟机规范只能是UTF-8

④ 运行程序,.class文件中的字符加载到内存,程序读取内存中的数据给标准输出流并解码成字符,输出到控制台(大概是这样)。这里如果不指定字符编码,也是使用操作系统的。如何指定需要分情况说明。

3. 如何设定标准输出流的字符编码

根据JEP 400里的描述,JDK17及以前,标准输出流使用默认字符编码,而默认字符编码是在Java运行时启动时从操作系统获取的。检查默认字符编码的方法:

java -XshowSettings:properties -version 2>&1 | grep file.encoding

所以,JDK17及以前通过设置file.encoding就可以。

到了JDK18,默认字符编码指定为UTF-8。我们虽然可以通过file.encoding来设置,但只能设置成COMPAT或者UTF-8,其他的可能没效果。如果设置成COMPAT,就像JDK17那样,从操作系统获取字符编码。

有意思的是JDK18中System.out和System.err却不用默认编码了,修改file.encoding对这俩没有效果,只能通过sun.stdout.encoding和sun.stderr.encoding来设置。虽然JEP400中说这两个属性依然是未指定和不被支持的(unspecified and unsupported),但这俩确实有效,我也没找到其他方法。

到了JDK19,新增了stdout.encoding和stderr.encoding两个属性,专门用来指定System.out和System.err的字符编码,如果不指定,还是按操作系统的来。

由于篇幅和时间限制,具体调试过程并未写出,有兴趣的人可以把几个关键版本的JDK都安装好,试着调试一下。

参考内容

[1] 网上类似问题解决办法「链接」

[2] JEP 400: UTF-8 by Default

[3] Chapter�4.燭he class File Format

标签:编码,UTF,encoding,IDEA,乱码,设置,字符,控制台
From: https://blog.csdn.net/zhilan_note/article/details/139629768

相关文章

  • idea常用配置
    目录常用配置目录结构设置主题设置编辑区主题滚轮修改字体大小设置自动导包功能设置显示行号设置忽略大小写提示设置默认的字体注释的字体颜色设置项目文件编码关联数据库常用配置进入设置界面目录结构设置主题设置编辑区主题滚轮修改字体大小设置自......
  • Zabbix配置中文显示及乱码问题
    页面配置为中文显示在zabbix5.0版本开始用户菜单更改为左侧栏显示,找到并点击UserSettings,Language修改语言为Chinese(zh_CN)即可。PS:一般在部署后初始配置时,未找到Chinese(zh_CN)这一项,修改如下:编辑配置文件vim/usr/share/zabbix/include/locales.inc.php修......
  • IDEA 忽然无法打开某个特定文件
    背景:IDEA中双击打开一个.py文件时,弹出一个文件类型的弹窗(没注意是什么,估计是不小心按到了什么快捷键),当时随便选的Text,结果不知道为什么,这个文件无法在IDEA中打开(之前都正常)由于对idea的filetypes设定不了解,所以一个菜单一个菜单往下看,因为同后缀的其它文件都可以打开,但是就这个......
  • 【IDEA 必备插件之一】这样注入 Bean 才爽
    今天我们来介绍一款免费的IDEA生产力插件,它叫BeanAssistant。我们可以在插件市场搜索BeanAssistant来安装它。前言不知道你们在平时的工作场景中是否经常遇到以下的情况。在一个方法中,需要调用某个实例接口的方法。我们经常会先在该类里面先注入这个接口的实例Bean,然后再调......
  • idea Webstorm Pycharm2024最新版 永久使用教程 附激活码亲测可用2099年
    IDEA2024的激活与安装(全网最靠谱,最快捷的方式)大家都在为使用IDEA需要收费而烦恼。IDEA,即IntelliJIDEA,是一款强大的集成开发环境,广泛应用于Java开发。但是IDEA是付费的,免费版功能有太少,怎么才能既免费,又能使用上正式版呢!当然还是激活啦(不是正版用不起,而是‘激活’更有性价比)......
  • IDEA 12大全局配置,快速提供开发效率
    IDEA相关配置整理于2024.06.0923:23@程序员猴哥1编码设置:File-->newprojectssettings-->settingsfornewprojects-->editor--->fileencodings-->globalencodeing:utf-8;projectencoding:utf-8;defaultencodingforpropertiesfiles:utf-8![img](file......
  • Idea运行前端项目--配置node配置
    1.idea中配置node.js的路径2.右键点击前端项目package.json-->ShownpmScript右键dev或serve-->Edit'dev'Settings3.右键项目根目录-->openin-->terminal-->执行命令npmi4.最后运行即可......
  • 2024 IDEA最新永久使用码教程(2099版)
    本篇文章我就来分享一下2024年当前最新版IntelliJIDEA最新注册码,教程如下,可免费永久,亲测有效,适合Windows和Mac。本教程适用于JB全系列产品,包括Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode等。(希望大家且用且珍惜)9H1390TRAK-eyJsaWNlbnN......
  • 深入了解Git:从数据模型到集成IDEA
    Git是现代软件开发中不可或缺的版本控制工具。理解Git的数据模型、暂存区、命令行接口,并将其集成到IDE(如IntelliJIDEA),可以显著提升开发效率。本文将从底层开始,逐步深入Git的各个方面,并介绍如何将其集成到IntelliJIDEA中。目录Git的数据模型暂存区Git的命令行接口将Git集......
  • 还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序
    ......