`
hz_chenwenbiao
  • 浏览: 994895 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java乱码问题分析(转)

阅读更多

java采用unicode编码来处理字符。Java程序无论是从/往文件系统以字符流读/写文件,还是往URL连接写HTML信息,或从URL连接读取参数值,都会有字符编码的转换。编/解码过程如下图:

乱码产生的根本原因是由于编码和解码采用的不是同一种码(GBK,UTF-8,ISO8859-1)。

字符串(String或char[])"123你"经过编码后的字节流(unicode字节流)为31 00 32 00 33 00 60 4f。如果你用new String("123你".getBytes("iso8859-1"), "gbk")来创建这个字符串时就会产生乱码。

因为getBytes("iso8859-1")取得的是"123你"经过iso8859-1编码后的字节流31 32 33 3f (iso8859-1字节流),
而在用new String(bytes, "gbk")构造字符串时java会将iso8859-1字节流(31 32 33 3f)当作是unicode字节流(因为java是采用unicode来处理字符的,所以它把字节流统统当作是unicode字节流来处理),因此31 32 33 3f也被它看成了是unicode字节流。而unicode字节流(31 32 33 3f)经过gbk编码后当然是123?了。于是,乱码产生了。

l         Javac是以系统默认编码(file.encoding系统属性)读入源文件,然后按Unicode进行编码的。

 

l         JAVA运行的时候,JAVA也是采用Unicode编码的,为了高度利用内存空间提高效率对Unicode字符编码采用了UTF-8的方式编码,并且默认输入和输出的都是操作系统的默认编码。

 

l         也就是说在new String(bytes,encode)中,系统认为输入的是编码为encode的字节流,换句话说,如果按encode来翻译bytes才能得到正确的结果;而在new String(bytes)中采用的就是根据file.encoding系统属性读入的编码方式来进行编码,同样也必须根据系统默认的编码才能得到正确的结果,这个结果最后要在JAVA中保存,它还是要从这个encode转换成Unicode,因为在JAVA中各种字符均是以Unicode的形式来处理的。

 

l         也就是说有bytes-->encode字符-->Unicode字符的转换;而在String.getBytes([encode])中,系统要做一个Unicode字符-->encode字符-->bytes的转换。

 

出自:http://www.jdsyxx.net/oblog313/user1/2/archives/2010/3119.html

及:http://www.360doc.com/content/07/0507/20/17598_487208.shtml

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics