1. 程式人生 > >properties亂碼,Transparent native-to-ascii conversion

properties亂碼,Transparent native-to-ascii conversion

1. 遇到的問題

properties中配置的國際化資源引發的亂碼問題

2. 亂碼產生的原因

預設情況下,專案中的配置檔案編碼跟隨系統。

如下圖,==配置檔案跟隨系統為GBK編碼,而Java預設是以ISO-8859-1的編碼讀取配置的,所以會出現亂碼==。解決方式是勾選Transparent native-to-ascii conversion,將所有字元轉成ascii編碼儲存(實際上就是轉成unicode轉義序列)

3. 配置編碼

從上圖可以看到配置編碼的地方有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中設定。