1.前言
因為裝系統的時候把中文寫在了系統路徑,現在我想把這個路徑寫在properties里面來讀取,可是
發現java 讀取會導致中文亂碼成 問號????的亂碼 ,百度找了好多博客,基本都是一摸一樣的抄襲,估計能不能用都不知道就復制上去了,
沒良心的帖子。
2.追擊原因
查找原因,是因為Java以二進制流的方式讀取properties ,導致無法識別中文,
網上有兩種的解決思路:
方法一是讀取的時候以 文件讀取方式 new InputStreamReade 來讀取並設定編碼格式 , 就像這樣,
,經測試,失敗,中文仍然是問號來替代。
方法二是 在properties配置文件里,不直接寫中文,而是以其他編碼格式替代 ,可以使用 native2ascii.exe 來將配置文件轉換 。
缺點:可是這有可能影響開發的效率,在中文數據比較少的的時候,沒必要這樣殺雞用牛刀 ,不然每次測試都需要將整個文件重新編碼再替代,太慢了!!!!
3.我的解決方式
知道原理,解決起來就有思路了,既然這樣,那我每次將有中文的數據都裝成unicode編碼再放入properties文件里面,像這樣
,再需要的地方再將Unicode編碼轉成utf-8即可
我集成了個工具【點擊查看】

1 package cn.cen2guo.clinic.util; 2 3 public class Unicode { 4 /** 5 * 字符串轉unicode, 【properties文件專用】 6 */ 7 public static String stringToUnicode(String str) { 8 StringBuilder sb = new StringBuilder(); 9 char[] c = str.toCharArray(); 10 for (char value : c) { 11 sb.append("\\").append("\\u").append(Integer.toHexString(value)); 12 } 13 return sb.toString(); 14 } 15 16 /** 17 * 字符串轉unicode, 【java 正常使用】 18 */ 19 public static String stringToUnicode2(String str) { 20 StringBuilder sb = new StringBuilder(); 21 char[] c = str.toCharArray(); 22 for (char value : c) { 23 sb.append("\\u").append(Integer.toHexString(value)); 24 } 25 return sb.toString(); 26 } 27 28 /** 29 * unicode轉字符串 30 */ 31 public static String unicodeToString(String unicode) { 32 StringBuilder sb = new StringBuilder(); 33 String[] hex = unicode.split("\\\\u"); 34 for (int i = 1; i < hex.length; i++) { 35 int index = Integer.parseInt(hex[i], 16); 36 sb.append((char) index); 37 } 38 return sb.toString(); 39 } 40 41 }
怎么使用呢?看測試
4.測試
5.注意
之所以有 properties文件專用 的方法,是因為properties文件里 符號 \ 必須要被另一個 \ 注解才可以視為字符串 ,為了方便
將編碼好的數據直接放到properties 文件里 ,才這樣做 ,不然得手動加 。
properties 取出數據后 前面得 \ 會自動去掉得 ,因此 正常 將unicode 轉 utf-8 即可。