1. 遇到的問題
properties中配置的國際化資源引發(fā)的亂碼問題

2. 亂碼產(chǎn)生的原因
默認情況下,項目中的配置文件編碼跟隨系統(tǒng)。
如下圖,==配置文件跟隨系統(tǒng)為GBK編碼,而Java默認是以ISO-8859-1的編碼讀取配置的,所以會出現(xiàn)亂碼==。解決方式是勾選Transparent native-to-ascii conversion,將所有字符轉(zhuǎn)成ascii編碼保存(實際上就是轉(zhuǎn)成unicode轉(zhuǎn)義序列)

3. 配置編碼
官方文檔。
https://www./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配置文件。
這三個選項存在優(yōu)先級,高優(yōu)先級的覆蓋低優(yōu)先級的。
可以看到File/Directory Encoding中配置了整個項目的根目錄為UTF-8,覆蓋了Project Encoding的GBK。
所以一般這三個配置我們一般都不用管,idea會自動配置File/Directory Encoding: UTF-8。
另外就是properties文件的單獨配置,默認情況下跟隨系統(tǒng)。
4. Transparent native-to-ascii conversion
Properties文件后面還跟隨著一個復選框Transparent native-to-ascii conversion。直接翻譯過來則是透明的將本地編碼轉(zhuǎn)成ascii編碼,==本質(zhì)上調(diào)用的是jdk bin目錄下的native2ascii.exe==。
從官方文檔上描述,選擇properties編碼格式和勾選Transparent native-to-ascii conversion這兩個操作是二選一,并且不是特殊情況下,這個復選框都應該勾選。(nmb你就默認不勾選)
如果勾選了復選框,那么前面的properties編碼格式就無所謂了,因為Transparent native-to-ascii conversion這個功能會將我們輸入的所有字符轉(zhuǎn)換成Unicode序列碼保存,例如我們輸入“登陸”兩個字符,實際上保存到properties時保存的是它的Unicode序列碼。
如圖,在idea中輸顯示是中文,用sublime打開之后發(fā)現(xiàn)是Unicode序列碼。

所以這也是為什么設(shè)置properties編碼格式無所謂的原因了,因為保存的字符都是ascii碼表中的字符。
==而當Java去讀取properties時,也會將自動將\uxxx的Unicode轉(zhuǎn)成對應的char。==
雖然說設(shè)置properties編碼格式的編碼格式是無所謂的,但是我們還是要將他設(shè)置成UTF-8以防出現(xiàn)其他意外。
例如文件一開始是以GBK創(chuàng)建的,并沒有勾選Transparent native-to-ascii conversion,后面再勾選上這個復選框時,不會自動將中文轉(zhuǎn)成Unicode,而且我們也看不出來這個錯誤。
但是我們再將編碼改成UTF-8時,我們就會發(fā)現(xiàn)亂碼了,我們就知道其實這些中文并沒有轉(zhuǎn)成unicode。所以一般情況下我們需要同時設(shè)置文件編碼為UTF-8并勾選復選框,或者設(shè)置文件編碼為ISO-8859-1也是可以的。
但是無論如何,Transparent native-to-ascii conversion是必須勾選的,除非你保證properties中不會出現(xiàn)ASCII以外的字符。
5. 為以后的項目也采用這個編碼設(shè)置
我們通過setting修改的編碼實際上只在當前項目生效,這也是為什么idea默認的.gitignore文件沒有忽略.idea目錄。
如果需要以后創(chuàng)建的項目也生效,我們需要從other setting中設(shè)置。


|