Java解决properties中中文乱码的问题

  • Properties文件介绍
  • 与Properties文件的前世今生
  • native2ascii.exe的使用
  • 首先编写配置文件
  • 实验
  • 修改测试代码进行更完整的测试


Properties文件介绍

properites文件是java项目中常用的配置文件,例如spring-boot中的application.properties. 它其实是一种以properites为后缀名的纯文本文件。它的配置特征以key=value为一行的形式作为一个配置项。

与Properties文件的前世今生

第一次接触到properties文件是,10年前,大学的时候老师讲java做国际化。应该目前java做国际级的标准形式也是采用properties文件实现的。这个时候明白properties文件中使用中文的内容是会出现乱码的。
这个时候接触到了java使用properties文件,是不可以直接配置中文内容的,java的在读取properties文件中的中文是会出现乱码。 这就是这篇文章的主题。
在当时老师介绍的方法就是需要使用jdk下面的native2ascii.exe将其中的非英文字符转换为unicode编码。
后来的工作中也多次使用到properties文件做为配置文件,也许大量的参数配置可能使用中文比较少,也有可能是使用的大量集成开发工具,例如,eclipse的PropertiesEditor帮我们解决了需要去中转换。让我渐渐的忘却掉了properties是不可以直接使用非英语字符的。
巧合,今天媳妇突然在spring中采用@Value注入的时候乱码如何解决。我第一反应就是懵逼。然后脑袋一闪,想起这个肯定跟properties中中文是如何解决乱码的,所以写下这篇文章给自己。绝对不好意思说技术分享,只是想回归一下当年没有如此强大的开发环境的古老的程序开发

native2ascii.exe的使用

其实看这名字native就只要是国际化相关的,难怪这么多年过去了,java项目的国际化还是乖乖的使用着properties

首先编写配置文件

  • 新建一个properties文件,例如:abc.properties
  • 采用key=value的形式在文本编辑器中编写配置项
hello=你好
geda=疙瘩
  • 使用命令native2ascii.exe 生成新的prooerties文件【abc.zh_cn.properties】---- 指定编码非常重要
native2ascii.exe -encoding utf-8 abc.properties abc.zh_cn.properties
  • 该目录下会产生一个新的文件abc.zh_cn.properties
  • 查看内容,相应的非英语字符已经变成了unicode编码了。

实验

  • 编写简易实验类文件Message.java
  • import java.util.Properties;
    import java.io.FileInputStream;
    
    public class Message{
      
      public static void main(String[] args) throws Exception{
    	  Properties pps = new Properties();
    	  pps.load(new FileInputStream("abc.properties"));
    	  String strValue = pps.getProperty("geda");
    	  System.out.println(strValue);
      }
      
    }
  • 为了测试简单,未做一些复杂的内容,涉及的文件也直接放到了 jdkbin目录下。文件目录如下:
  • java properties加载路径乱码 java读取properties文件乱码_配置文件


  • 编译Message.java文件产生对应的字节码文件Message.class文件
  • javac Message.java
  • java properties加载路径乱码 java读取properties文件乱码_java_02


  • 运行Message.class文件
  • java Message
  • 测试结果:
  • java Message
  • 结果内容:
  • java properties加载路径乱码 java读取properties文件乱码_java_03


  • 修改代码
  • import java.util.Properties;
    import java.io.FileInputStream;
    
    public class Message{
     
     public static void main(String[] args) throws Exception{
         Properties pps = new Properties();
         pps.load(new FileInputStream(args[0])); # 将配置文件用参数传入
         String strValue = pps.getProperty("geda");
         System.out.println(strValue);
     }
     
    }
  • 重新编译Message.java
  • 重新采用使用了unicode编码的properties文件实验:
  • java Message abc_zh_cn.properties
  • 运行结果
  • java properties加载路径乱码 java读取properties文件乱码_java_04


修改测试代码进行更完整的测试

  • 修改java代码
  • import java.util.Properties;
    import java.io.FileInputStream;
    
    public class Message{
     
     public static void main(String[] args) throws Exception{
         Properties pps = new Properties();
         pps.load(new FileInputStream(args[0]));  # 配置文件从参数1中获取
         String strValue = pps.getProperty(args[1]); # 配置文件的key从参数2中获取
         System.out.println(strValue);
     }
     
    }
  • 重新编译Message.java
  • 负向测试
  • java properties加载路径乱码 java读取properties文件乱码_java_05


  • 测试输出的都是乱码
  • 正向测试
  • java properties加载路径乱码 java读取properties文件乱码_配置文件_06


  • 测试结果不再是乱码