Java字符编码处理(UTF-8/ISO-8859-1) 之一  -- 读文本文件乱码问题

当我们用java.io.Properties的load()方法读属性文件,一般会将字符编码成ISO-8859-1的字符串,如果文件的编码方式不是ISO-8859-1,那么读入的字符可能有乱码出现。比如文件是UTF-8编码的(这可以用System.getProperty("file.encoding")得到,这是你的操作系统决定的,一般中文Windows是GBK,英文Windows是UTF-8),那么必须做如下转换(将字符串以ISO-8859-1读成byte数组,再转换成UTF-8编码的字符串):

Properties props=new Properties();

props.load(new FileInputStream("zn.properties"));

String v=(String)props.get("key.zn");

String transValue=new String(v.getBytes("iso-8859-1"),"utf-8"));

以上可以解决属性文件中含有显式中文的情况,如下面的key/value:

key.zn=中文

当然如果我们做得通用点,可以用以下代码替代上面的代码:

Properties props=new Properties();

props.load(new FileInputStream("zn.properties"));

String v=(String)props.get("key.zn");

String file_encoding = System.getProperty("file.encoding");

String transValue=new String(v.getBytes("iso-8859-1"),file_encoding));

这种文件写法往往会有问题,因为你用操作系统本身的文件编码方式编码的文件在另外一个国家的操作系统不一定支持,比如GBK编码的文件放到纯英文的环境下可能会乱码,所以最安全的方式是讲文件里的字符再编码一次,将像下面这样:

属性文件中的字符串本身又是经过编码的,怎么显示呢?比如下面的key/value:

key.utf8=\u6b22\u8fce #utf-8编码

key.iso=\u00e6\u00ac\u00a2\u00e8\u00bf\u008e #iso-8859-1编码

key.gbk=\u5a06\u3223\u7e4b #gbk编码

如果我们的属性文件是UTF-8编码的,然而里面字符又出现了二次编码的如key.gbk (比如通过Java自带的native2ascii工具),它是将中文字符用GBK编码后存入了以UTF-8的编码的文件中,第一层是文件编码,第二层是字符编码,这种情况必须做编码转换:

String gbk=(String)props.get("key.gbk");

String transGbk=new String(gbk.getBytes("gbk"),"utf-8");

注意这里Properties.load()会将第二次编码解码,也就是此时的gbk字符是由GBK编码的,而不是ISO-8859-1编码的,所以先还原成GBK编码的byte数组,再转换成UTF-8编码(本例中属性文件本身的编码方式)。

所以这里有一个现象就是如果我们读取“key.utf8”这个以utf-8二次编码的值时就可以直接用如下代码:

String utf8=(String)props.get("key.utf8");

为什么不用转换了,我们可以用下面的等效代码替代看一下:

String transUtf8=new String(utf8.getBytes("utf-8"),"utf-8");

可以看到因为我们要先将二次编码(第一个utf-8)还原成UTF-8的byte数组,再转换成UTF-8(第二个utf-8)编码(本例中属性文件本身的编码方式),当然如果文件编码不是UTF-8,那转换还是需要的。

这也是我们做国际化时要注意的一点,国际化时可以将文件中的值编码成任何方式,比如可以用ISO-8859-1,但转换时必须先还原成ISO-8859-1再转成文件编码(UTF-8)。

另外,这里讲的虽然是Properties文件,其实读普通文件也是一样的,必须将读出的string转码:

String transValue=new String(v.getBytes("字符编码"),文件编码));

java utf8转iso8859-1_Java字符编码处理(UTF-8/ISO-8859-1)之一 –读文本文件乱码问题 | 学步园...相关推荐

  1. 一文读懂字符编码(ASCII、ISO 8859、GB系列、Unicode)

    一文读懂字符编码(ASCII.ISO 8859.GB系列.Unicode) 一.字符编码相关组织 1.1 ANSI 美国国家标准学会 1.2 Ecma 国际 1.3 ISO/IEC 1.4 统一码联盟 ...

  2. 【转】刨根究底字符编码之四——EASCII及ISO 8859字符编码方案

    1. 计算机出现之后,首先逐渐从美国发展到了欧洲.由于欧洲很多国家所用到的字符中,除了基本的.美国也用的那128个ASCII字符之外,还有很多衍生的拉丁字母等字符.比如,在法语中,字母上方有注音符号: ...

  3. 字符编码的故事(ASCII ISO GBK GB2312 UTF-8)

    转载自:http://yuncode.net/article/a_520afe25b065d13 另有一篇对"UTF-8 GBK UTF8 GB2312 之间的区别和关系"描述比较 ...

  4. Java学习总结:45(字符编码)

    字符编码 在实际工作中最常见的4种编码如下: GBK.GB2312:中文的国标编码,其中GBK包含简体中文与繁体中文两种,而GB2312只包含简体中文: ISO8859-1:是国际编码,可以描述任何文 ...

  5. ANSI, UTF-8, Unicode, GBK, GB2312 字符编码小结

    这两天碰见一个Bug,涉及到字符编码,索性研究了下,整理出来,以便今后查阅. ASCII码,0~127,128个,这个就不用多说了,他是计算机文明的基石.但是这里面只有英文字母,其他国家如何把本国的文 ...

  6. java/jsp/sql server项目 字符编码统一_JSP开发过程遇到的中文乱码问题及解决方案...

    对于程序猿来说,乱码问题真的很头疼,下面列举几种常见的乱码. 1.数据库编码不一致导致乱码 解决方法:首先查看数据库编码,输入: show variables like "%char%&qu ...

  7. JS中utf8和GBK的字符编码转换

    1.PHP中的 json_encode 函数只限编码UTF-8的数据,当转换GBK或者GB2312等编码的数据时,会将汉字转为NULL. 2.JavaScript 中json 的使用: ① 将对象转为 ...

  8. java gsoap_gsoap c与java web之间传输字符串中文乱码问题 | 学步园

    中文乱码,也就是编码问题不一致,我们也不深究用什么soap_set_mode用SOAP_C_MBSTRING还是SOAP_C_UTFSTRING 只需要我们对字符进行转码成一个统一规范就可以正常显示了 ...

  9. java跨站点脚本编制_跨站点请求伪造 跨站点脚本编制 通过框架钓鱼漏洞 | 学步园...

    1.跨站点请求伪造 跨站点脚本编制 通过框架钓鱼漏洞 主要是通过在url或参数中添加脚本如: 1.URL中添加 2.参数value=. 添加一个过滤器对特殊字符进行拦截 package com.xxx ...

最新文章

  1. echo向文件中写入
  2. c语言算定积分d的大小,你知道C语言怎么实现求定积分吗
  3. 超时时间已到。在操作完成之前超时时间已过或服务器未响应
  4. 如何在VS一个工程里面测试不同代码?(创建不同项目,并将需要运行的项目设为启动项目)
  5. 当 Android 开发者遇见 TensorFlow
  6. Codeforces 988F. Rain and Umbrellas
  7. Hbase中的列式表映射到hive的外表
  8. 可用性SLA还不懂?看完这个故事就懂了
  9. (王道408考研操作系统)第三章内存管理-第二节3:页面置换算法2
  10. 7-102 单词首字母大写 (15 分)
  11. 音视频开发(1)---Red5流服务器搭建
  12. ​百度网盘下线SVIP免第三方广告特权;小米回应手机异常发热;Windows 11新应用商店将于6月24日亮相|极客头条...
  13. 配置Kafka集群和zookeeper集群
  14. C/C++学习笔记 指针1
  15. 【枚举排列】生成1~n的排列生成可重集的排列
  16. 微积分学基本定理简介
  17. 正态总体均值的假设检验
  18. 基于STM32设计物联网在线智能称重系统(OneNet)_2022
  19. pubg体验服服务器维护,简单1招,教你快速获得《Pubg Mobile》体验服“邀请码”!...
  20. 金山卫士开源软件之旅(十) KSafeMainproject的分析 1

热门文章

  1. oracle怎么判断地址相似,如何查看oracle数据文件的地址
  2. docker中的mysql操作
  3. Python configparser模块操作代码实例
  4. Python使用pyzabbix调用Zabbix API
  5. Python使用xlwt和xlrd读写excel文件
  6. Ubuntu解除端口占用
  7. gridview获取当前行索引的方法
  8. asp.net调用js方法小结
  9. [机器学习-实践]支持向量机(SVM)从例子代码中学习
  10. leetcode —— 863. 二叉树中所有距离为 K 的结点