java解决properties中中文乱码问题

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目录下。文件目录如下:
    在这里插入图片描述
  • 编译Message.java文件产生对应的字节码文件Message.class文件
    javac Message.java
    
    编译java文件的内容
  • 运行Message.class文件
    java Message
    
  • 测试结果:
    java Message
    
  • 结果内容:
    异常测试结果
  • 修改代码
    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代码
    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
  • 负向测试
    负向测试结构
  • 测试输出的都是乱码
  • 正向测试
    正向测试结果
  • 测试结果不再是乱码
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值