300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > java utf8转iso8859-1_Java字符编码处理(UTF-8/ISO-8859-1)之一 –读文本文件乱码问题 | 学步园...

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

时间:2019-01-06 05:33:46

相关推荐

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

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("字符编码"),文件编码));

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。