properties乱码,Transparent native-to-ascii conversion

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个:

  1. Global Encoding:UTF-8
  2. Project Encoding: System Default
  3. File/Directory Encoding: UTF-8
  4. 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中设置。

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值