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 即可。