JAVA与IDEA编码(乱码问题分析)全解析对于整个编码问题的根本分析思路可以先参考我的另⼀篇博客:
本⽂从三个⽅⾯解析JAVA与IDEA的编码问题
1. 代码源⽂件的编码与javac编译器读取源⽂件使⽤的编码
2. java程序输出编码与显⽰控制台使⽤的编码
3.properties⽂件的编码问题
代码源⽂件的编码与javac编译器读取源⽂件使⽤的编码需⼀致
⾸先IDEA关于编码的设置主战场如下图:
Global Encoding作为IDE的全局编码,Project Encoding为System Default时⽣效,当Project Encoding不为System Default时,以Project Encoding为准。
经过⼀天的研究,发现IDEA这⼀块的功能还不是很完善成熟的,特别是⼀个Project中使⽤不同编码的*.java⽂件时,极其容易出现各种不确定的编码问题(⽬前⽤的是IDEA 2019.3,不知道以后会不会优化)。所以个⼈的建议是,⼀个Project的所有*.java最好是使⽤同⼀种编码,并且必须与此处的设置要⼀致,下⽅的特定⽂件编码列表只⽤于配置⽂件、属性⽂件或其他不含*.java的⽂件夹(最好是完全不要⼿⼯去编辑添加这个特定⽂件编码列表,IDEA会⾃动添加你的特定⽂件)。该处的设置主要是决定javac编译源⽂件时读取源⽂件⽤的编码,源⽂件与javac读取源⽂件所⽤的编码必须⼀致,否则,在java运⾏字节码⽂件时,⽆论怎么配置,都不⼤可能产⽣正确的输出,因为在编译阶段就出现了错误转码(源⽂件编码->java字节码⽂件内部表⽰编码)。
注意:改变Global Encoding或Project Encoding会影响新建⽂件的默认编码,但不会对已有的⾮纯ascii字符的源⽂件进⾏⾃动编码转换,这就意味着改变这个设置后,需要⼿动转换项⽬中编码不⼀致的源⽂件。
具体步骤:打开编码不⼀致的源⽂件,右下⾓选择新的编码,选择convert进⾏转换。
另外提⼀句,命令⾏指定javac读取源⽂件编码的⽅式如下:
javac -encoding GBK Test.java
也可以在IDEA如下位置配置:
⼀般情况下我们都是通过IDEA⾃动根据Global Encoding或Project Encoding去配置,⽆需⼿动添加。
JAVA运⾏时输出到控制台的编码与控制台的解析编码需⼀致
在讨论这个问题前必须保证上⾯⼀点已经满⾜,即*.java被javac使⽤正确的编码去编译了,否则研究这⼀步毫⽆意义。
在第⼀步中,源程序中的字符串(特别是中⽂字符串)已经被正确转换为java字节码⽂件中的表⽰形式(机器⽆关,⼀般是Unicode的形式)。接下来的任务是以正确的编码输出到控制台,我们以控制台为研究对象,其输⼊是java程序的输出,输出是显⽰器(操作系统接⼝)。
java编译器ide最新版下载JAVA程序的输出给控制台的编码可通过指定-ding参数配置,如:
java -ding=utf-8 Test
此处指定的编码⽆需与上⽂第⼀步中的⼀致,因为所有*.java中字符都已经被转化为⼀种中间表⽰形式存储在java字节码⽂件中(.class),输出到控制体可指定的编码是完全⾃由的。
对于控制台,要正确解析java程序输出的编码,就要选择⼀致的编码解析⽅式,在macos中,配置⽅式如下:
⾄此,当保证代码源⽂件的编码与javac编译器读取源⽂件使⽤的编码⼀致 和 JAVA运⾏时输出到控制台的编码与控制台的解析编码⼀致后,控制台输出的写在*.java中的字符信息就不应该会再显⽰乱码。
⾄于不是写在*.java中的信息,要保证不输出乱码,就要保证java程序中读取其他⽂件使⽤的编码与被读取⽂件所使⽤的编码要⼀致。详细可参考下⾯第三点作为例⼦。
另外,要表扬下IDEA⾃带的标准输出框,他会⾃动根据运⾏java程序时指定的(显式或隐式)-ding参数调节其解析的编码,所以只要*.java被使⽤正确的编码编译,就会正确输出写在*.java中的字符串。
properties⽂件的编码问题
这⾥主要讨论下图⼀中,这⼀块的具体配置与解析:
这⾥的选择编码与后⾯的可选项Transparent native-to-ascii conversion是⼆选⼀的。当勾选Transparent native-to-ascii conversion 时,其实采⽤的编码是ISO 8859-1编码(这⾥要批评下IDEA这
种容易令⼈困惑的设计),对于ISO 8859-1不能表⽰的标准字符,会采⽤转义字符+Unicode编码的形式去表⽰,如“中国”⼆字,使⽤ISO 8859-1应该表⽰为\u4E2D\u56FD,为了观看⽅便,IDEA会把这类表⽰转化为相应的字符显⽰,实际⽂件存储依然使⽤转义字符去表⽰。
在SpringBoot中,默认是以ISO 8859-1编码去读取*.porperties⽂件的,若使⽤utf-8或者GBK编码去编写porperties⽂件,就可能会导致出现乱码输出。因此,在开发SpringBoot应⽤时,可把这个Transparent native-to-ascii conversion勾上,在IDEA的帮助下,可同时兼顾查看⽅便与解决输⼊编码⼀致的问题。
注意,已采⽤utf-8或gbk编码的porperties⽂件(包含中⽂),勾选Transparent native-to-ascii conversion后会在下次编辑该⽂件时⾃动转换编码为ISO 8859-1。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。