Live a simple life

          沉默(zhu_xing@live.cn)
          隨筆 - 48, 文章 - 0, 評論 - 132, 引用 - 0
          數據加載中……

          【Java】properties中文亂碼問題

                  上周五下午,處理一個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中文亂碼的問題會遇到不少,尤其是用字符流的時候。老早之前和亂碼做過斗爭,經驗是要搞清楚產生亂碼的基本原理,然后再修理它

          本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!

          posted on 2008-09-01 14:51 zhuxing 閱讀(11723) 評論(8)  編輯  收藏 所屬分類: Java

          評論

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          難道博主沒有聽說過PropertiesEditor插件?
          2008-09-01 15:04 | Jacky-Q

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          聽說過,而且還定制過它的源碼
          2008-09-01 15:06 | zhuxing

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          properties里面最好不要直接寫中文吧~~~用nativa2ascii先轉一下啊~
          2008-09-01 16:01 | popoer

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          @popoer
          挺美好的想法
          2008-09-01 16:04 | zhuxing

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          很好,已經解決了!
          2011-11-21 10:50 | 梁玉龍

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          不錯,解決了問題
          2012-03-20 13:53 | liveimain

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          很好
          2012-05-18 12:42 | spark360

          # re: 【Java】properties中文亂碼問題  回復  更多評論   

          理解了這個原理,Properties文件編碼沒有變,在解析類中的參數就給它搞成UTF-8的,就可以了。
          2012-05-18 12:44 | spark360
          主站蜘蛛池模板: 金川县| 盐山县| 通山县| 尼勒克县| 海城市| 南溪县| 上饶市| 家居| 惠安县| 大埔县| 茶陵县| 页游| 七台河市| 深圳市| 宜阳县| 吴忠市| 高邑县| 隆昌县| 博罗县| 靖西县| 固始县| 高邮市| 浑源县| 荔浦县| 乌拉特前旗| 堆龙德庆县| 孟州市| 扎鲁特旗| 昂仁县| 榆社县| 福贡县| 东平县| 观塘区| 泰安市| 雅安市| 湟中县| 财经| 高阳县| 长治县| 寿宁县| 当阳市|