zoukankan      html  css  js  c++  java
  • 读取 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 即可。

  • 相关阅读:

    队列
    Collection类
    Hashtable类、IdentityHashMap和WeakHashMap类
    LinkedHashMap类
    广播的种类:有序广播和无序广播
    自定义的BroadCastReceiver
    String的两个API,判断指定字符串是否包含另一字符串,在字符串中删除指定字符串。
    BroadcastReceiver的最简单用法
    Notification通知栏
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/12426059.html
Copyright © 2011-2022 走看看