1. 遇到的问题
properties中配置的国际化资源引发的乱码问题
2. 乱码产生的原因
默认情况下,项目中的配置文件编码跟随系统。
如下图,配置文件跟随系统为GBK编码,而Java默认是以ISO-8859-1的编码读取配置的,所以会出现乱码。解决方式是勾选Transparent native-to-ascii conversion
,将所有字符转成ascii编码保存(实际上就是转成unicode转义序列)
3. 配置编码
官方文档。
https://www.jetbrains.com/help/idea/settings-file-encodings.html
从上图可以看到配置编码的地方有4个:
- Global Encoding:UTF-8
- Project Encoding: System Default
- File/Directory Encoding: UTF-8
- Properties files Encoding:System Default
前三个是配置项目中文件的编码,不包括properties配置文件。
这三个选项存在优先级,高优先级的覆盖低优先级的。
可以看到File/Directory Encoding中配置了整个项目的根目录为UTF-8,覆盖了Project Encoding的GBK。
所以一般这三个配置我们一般都不用管,idea会自动配置File/Directory Encoding: UTF-8
。
另外就是properties文件的单独配置,默认情况下跟随系统。
4. Transparent native-to-ascii conversion
Properties文件后面还跟随着一个复选框Transparent native-to-ascii conversion
。直接翻译过来则是透明的将本地编码转成ascii编码,本质上调用的是jdk bin目录下的native2ascii.exe。
从官方文档上描述,选择properties编码格式和勾选Transparent native-to-ascii conversion
这两个操作是二选一,并且不是特殊情况下,这个复选框都应该勾选。(nmb你就默认不勾选)
如果勾选了复选框,那么前面的properties编码格式就无所谓了,因为Transparent native-to-ascii conversion
这个功能会将我们输入的所有字符转换成Unicode序列码保存,例如我们输入“登陆”两个字符,实际上保存到properties时保存的是它的Unicode序列码。
如图,在idea中输显示是中文,用sublime打开之后发现是Unicode序列码。
所以这也是为什么设置properties编码格式无所谓的原因了,因为保存的字符都是ascii码表中的字符。
而当Java去读取properties时,也会将自动将\uxxx的Unicode转成对应的char。
虽然说设置properties编码格式的编码格式是无所谓的,但是我们还是要将他设置成UTF-8以防出现其他意外。
例如文件一开始是以GBK创建的,并没有勾选Transparent native-to-ascii conversion
,后面再勾选上这个复选框时,不会自动将中文转成Unicode,而且我们也看不出来这个错误。
但是我们再将编码改成UTF-8时,我们就会发现乱码了,我们就知道其实这些中文并没有转成unicode。所以一般情况下我们需要同时设置文件编码为UTF-8并勾选复选框,或者设置文件编码为ISO-8859-1也是可以的。
但是无论如何,Transparent native-to-ascii conversion
是必须勾选的,除非你保证properties中不会出现ASCII以外的字符。
5. 为以后的项目也采用这个编码设置
我们通过setting修改的编码实际上只在当前项目生效,这也是为什么idea默认的.gitignore
文件没有忽略.idea
目录。
如果需要以后创建的项目也生效,我们需要从other setting中设置。