zoukankan      html  css  js  c++  java
  • 解决 properties.getProperty() 字符串中文乱码的情况

    一、情况

    程序中通过读取 properties 配置文件来完成设置参数等功能,但是当配置文件中存在中文时,再通过以下(错误示范)代码进行读取并取值时,当值为中文时,则中文乱码(英文等字符不受影响)

    // 错误示范代码
    Properties properties = new Properties();
    InputStream inputStream = TestClass.class.getResourceAsStream("/ScreenShotParams.properties");
    properties.load(inputStream);
    String saveLocationDir = properties.getProperty("saveLocationDir");
    
    LOGGER.info("saveLocationDir:" + saveLocationDir);
    

    二、分析

    InputStream 字节流来读取中文字符,肯定乱码啦,改用字符流试试?

    三、解决

    // 正确代码
    Properties properties = new Properties();
    InputStream inputStream = TestClass.class.getResourceAsStream("/ScreenShotParams.properties");
    InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");
    BufferedReader br = new BufferedReader(isr);
    // 一定一定要 load 设置编码后的字符流
    properties.load(br);
    String saveLocationDir = properties.getProperty("saveLocationDir");
    
    LOGGER.info("saveLocationDir:" + saveLocationDir);
    

    按以上正确代码读取配置时,仍中文乱码的情况时

    • 通过记事本等工具检查并修改配置文件的编码格式为 UTF-8,然后再在代码中按照 UTF-8 格式编码进行读取

    • 检查 properties.load() 的参数是否是编码读取后的字符流,如果还是 InputStream 字节流时则不会生效,该乱码还乱码

    四、知识点

    • 虽然 InputStreamReader 也能满足中文不乱码的要求,但是还是采用 BufferReader 会更加高效

    • 保证中文不乱码的前提是:编码和解码的格式要保持一致,比如编码是 UTF-8,则解码格式也一定要是 UTF-8

    • 在 IDEA 中创建的 properties 后缀名文件,在记事本中查看时,为 ANSI 格式,不过可以通过记事本等工具将文件格式修改为 UTF-8

    • 英文,数字,符号等占用两个字节,中文占用三个字节

  • 相关阅读:
    atitit.session的原理以及设计 java php实现的异同
    atitit.破解 拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结
    java softReference 详解
    android开发:TextView中android:autoLink属性的作用
    抽象类和接口的简单差别
    android一个简单的线程实例
    Java 批注
    最简单的菜单操作
    AsyncTask的参数介绍
    (转)android中ListView在划屏到底部的时候动态添加ListView的Item实现
  • 原文地址:https://www.cnblogs.com/zhiyin1209/p/12633902.html
Copyright © 2011-2022 走看看