上周五下午,處理一個bug的時候就碰到這種鬼事情了,雖然原來腦子中有印象而且肯定也處理過,但就是想不起來了,試了半個小時才想起來properties的內在機制默認是用ISO8859-1 encoding進行處理的(當時網絡壞了,沒法上網查,能想到的encoding基本上都實現了...)。寫一下,遇到的哥們就不在麻煩了(最討厭這種亂七八糟的問題了~_~)
【原理解釋】
我們用API操作properties文件,如果獲取的屬性值是中文,為什么會出現亂碼呢?
我們知道,如果編碼(輸出)和解碼(讀入)用的encoding是不一致的有可能會引起中文亂碼問題,如果這兩種encoding沖突,則你基本上就中獎了。看兩個我們熟悉的eclipse提示:

1、假設如果我們創建properties文件用的encoding是GBK,我們寫入了中文
2、Properties文件默認機制是采用ISO8859-1處理
3、我們用Properties.getProperty(String key)接口讀取內容,這是時候得到的是亂碼。因為想用ISO8859-1對GBK編碼的內容進行解碼
4、我們把用Properties.getProperty(String key)接口讀取內容轉換為創建properties文件時用的encoding(GBK)不就解決問題了
【代碼示例】
1 public class PropertiesUtil {
2 /**
3 * util class
4 */
5 private PropertiesUtil() {}
6
7 /**
8 * 指定編碼獲取properties文件中的屬性值(解決中文亂碼問題)
9 *
10 * @param properties java.util.Properties
11 * @param key 屬性key
12 * @return
13 */
14 public static String getProperty(Properties properties, String key, String encoding) throws UnsupportedEncodingException {
15 //param check
16 if (properties == null)
17 return null;
18
19 //如果此時value是中文,則應該是亂碼
20 String value = properties.getProperty(key);
21 if (value == null)
22 return null;
23
24 //編碼轉換,從ISO8859-1轉向指定編碼
25 value = new String(value.getBytes("ISO8859-1"), encoding);
26 return value;
27 }
28 }
如果你的應用創建中使用的系統默認編碼,則如下轉化:
PropertiesUtil.getProperty(properties, "TestKey", System.getProperty("file.encoding"));
PS:java中文亂碼的問題會遇到不少,尤其是用字符流的時候。老早之前和亂碼做過斗爭,經驗是要搞清楚產生亂碼的基本原理,然后再修理它
本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!