properties中配置的國(guó)際化資源引發(fā)的亂碼問題
默認(rèn)情況下,項(xiàng)目中的配置文件編碼跟隨系統(tǒng)。
如下圖,==配置文件跟隨系統(tǒng)為GBK編碼,而Java默認(rèn)是以ISO-8859-1的編碼讀取配置的,所以會(huì)出現(xiàn)亂碼==。解決方式是勾選Transparent native-to-ascii conversion
,將所有字符轉(zhuǎn)成ascii編碼保存(實(shí)際上就是轉(zhuǎn)成unicode轉(zhuǎn)義序列)
官方文檔。
https://www.jetbrains.com/help/idea/settings-file-encodings.html
從上圖可以看到配置編碼的地方有4個(gè):
1. Global Encoding:UTF-8
2. Project Encoding: System Default
3. File/Directory Encoding: UTF-8
4. Properties files Encoding:System Default
前三個(gè)是配置項(xiàng)目中文件的編碼,不包括properties配置文件。
這三個(gè)選項(xiàng)存在優(yōu)先級(jí),高優(yōu)先級(jí)的覆蓋低優(yōu)先級(jí)的。
可以看到File/Directory Encoding中配置了整個(gè)項(xiàng)目的根目錄為UTF-8,覆蓋了Project Encoding的GBK。
所以一般這三個(gè)配置我們一般都不用管,idea會(huì)自動(dòng)配置File/Directory Encoding: UTF-8
。
另外就是properties文件的單獨(dú)配置,默認(rèn)情況下跟隨系統(tǒng)。
Properties文件后面還跟隨著一個(gè)復(fù)選框Transparent native-to-ascii conversion
。直接翻譯過來則是透明的將本地編碼轉(zhuǎn)成ascii編碼,==本質(zhì)上調(diào)用的是jdk bin目錄下的native2ascii.exe==。
從官方文檔上描述,選擇properties編碼格式和勾選Transparent native-to-ascii conversion
這兩個(gè)操作是二選一,并且不是特殊情況下,這個(gè)復(fù)選框都應(yīng)該勾選。(nmb你就默認(rèn)不勾選)
如果勾選了復(fù)選框,那么前面的properties編碼格式就無所謂了,因?yàn)?code>Transparent native-to-ascii conversion這個(gè)功能會(huì)將我們輸入的所有字符轉(zhuǎn)換成Unicode序列碼保存,例如我們輸入“登陸”兩個(gè)字符,實(shí)際上保存到properties時(shí)保存的是它的Unicode序列碼。
如圖,在idea中輸顯示是中文,用sublime打開之后發(fā)現(xiàn)是Unicode序列碼。
所以這也是為什么設(shè)置properties編碼格式無所謂的原因了,因?yàn)楸4娴淖址际莂scii碼表中的字符。
==而當(dāng)Java去讀取properties時(shí),也會(huì)將自動(dòng)將\uxxx的Unicode轉(zhuǎn)成對(duì)應(yīng)的char。==
雖然說設(shè)置properties編碼格式的編碼格式是無所謂的,但是我們還是要將他設(shè)置成UTF-8以防出現(xiàn)其他意外。
例如文件一開始是以GBK創(chuàng)建的,并沒有勾選Transparent native-to-ascii conversion
,后面再勾選上這個(gè)復(fù)選框時(shí),不會(huì)自動(dòng)將中文轉(zhuǎn)成Unicode,而且我們也看不出來這個(gè)錯(cuò)誤。
但是我們?cè)賹⒕幋a改成UTF-8時(shí),我們就會(huì)發(fā)現(xiàn)亂碼了,我們就知道其實(shí)這些中文并沒有轉(zhuǎn)成unicode。所以一般情況下我們需要同時(shí)設(shè)置文件編碼為UTF-8并勾選復(fù)選框,或者設(shè)置文件編碼為ISO-8859-1也是可以的。
但是無論如何,Transparent native-to-ascii conversion
是必須勾選的,除非你保證properties中不會(huì)出現(xiàn)ASCII以外的字符。
我們通過setting修改的編碼實(shí)際上只在當(dāng)前項(xiàng)目生效,這也是為什么idea默認(rèn)的.gitignore
文件沒有忽略.idea
目錄。
如果需要以后創(chuàng)建的項(xiàng)目也生效,我們需要從other setting中設(shè)置。
聯(lián)系客服