黑马程序员技术交流社区

标题: 乱码的分析 [打印本页]

作者: 黑马张旭    时间: 2013-1-28 17:54
标题: 乱码的分析
java 采用unicode 编码来处理字符。Java 程序无论是从/往文件系统以字符流读/写文件,还是往URL 连接写 HTML 信息,或从URL 连接读取参数值,都会有字符编码的转换。编/解码过程如下图:

乱码产生的根源是由于编码和解码采用的不是同一种码(gbk,utf-8,iso8859-1)。
字符串(String 或char[])"123你" 经过java 编码后的字节流(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字节流),而在用new String(bytes, "gbk") 构造字符串时java 则将iso8859字节流(31 32 33 3f)当作是unicode 字节流(因为java 是采用unicode 来处理字符的,所以它把字节流统统当作是unicode 字节流),因此它把31 32 33 3f 也看成是unicode 字节流。而unicode 字节流(31 32 33 3f)经过gbk 编码后当然是123? 了。于是,乱码产生了。下面的是一个测试程序:
public class Charset {
    public static void main(String[] args) {
        String str = "123你";
        try {
            byte[] unicode = str.getBytes("unicode");
            for (int i=0; i<unicode.length; i++)
                System.out.print(Integer.toHexString(unicode) + " ");
            System.out.println(new String(unicode));        // ??1 2 3 `O
            byte[] utf8 = str.getBytes("utf-8");
            for (int i=0; i<utf8.length; i++)
                System.out.print(Integer.toHexString((utf8)) + " ");
            System.out.println(new String(utf8));        // 123浣?
            byte[] iso88591 = str.getBytes("iso8859-1");
            for (int i=0; i<iso88591.length; i++)
                System.out.print(Integer.toHexString((iso88591)) + " ");
            System.out.println(new String(iso88591));        // 123?
            byte[] gbk = str.getBytes("gbk");
            for (int i=0; i<gbk.length; i++)
                System.out.print(Integer.toHexString((gbk)) + " ");
            System.out.println(new String(gbk));        // 123你
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.jpg (87.63 KB, 下载次数: 29)

1

1

2.jpg (113.64 KB, 下载次数: 34)

2

2

3.jpg (20.44 KB, 下载次数: 27)

3

3

1.jpg (87.63 KB, 下载次数: 29)

1.jpg

作者: 许庭洲    时间: 2013-2-1 19:45
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2