读取 properties 配置文件含有中文的value内容 导致中文乱码 的解决办法

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 }
Unicode.class

 

怎么使用呢?看测试

 

4.测试

 

 

 

 

5.注意

之所以有 properties文件专用 的方法,是因为properties文件里 符号 \ 必须要被另一个  \ 注解才可以视为字符串 ,为了方便

 

 

将编码好的数据直接放到properties 文件里 ,才这样做 ,不然得手动加  。

properties 取出数据后 前面得 \ 会自动去掉得 ,因此 正常 将unicode 转 utf-8 即可。

 

posted @ 2020-03-06 13:28  岑惜  阅读(2825)  评论(0编辑  收藏  举报