JAVA字符编码测试

几点注意:

1,ASCII码和ISO-8859-1都是单字节编码,ASCII码能表示128个字符,ISO-8859-1总共能表示256个字符。都不能表示中文,如果中文字符或其它不在IOS-8859码值范围内的字符会统一用3f表示(显示为"?", 通常所说的"黑洞");

2,GBK兼容GB2312,是双字节编码,GB2312包含6763个汉字,GBK包含21003个汉字;

3,UTF-16为定长双字节编码,大大简化了字符串的操作,但是会浪费存储空间。JAVA以UTF-16作为内存存储格式(见编码测试输出source行);

4,UTF-8采用变长,不同类型的字符可以由1~6个字节组成(汉字一般3个字节)。UTF-8规则如下:

  • 如果是1个字节,最高位(第8位)为0,则表示这是1个ASCII字符(00~7F)。可见,所有的ASCII编码已经是UTF-8了。
  • 如果是1个字节,以11开头,则连续的1的个数暗示这个字符的字节数,例如:110xxxxx代表它是双字节UTF-8字符的首字节。
  • 如果是1个字节,以10开头,表示它不是首字节,则需要向前查找才能得到当前字符的首字节。

 

测试代码:

package com.test.main;

public class TestCode {

    public static void encode(){
            String name = "淘!我喜欢!";
            toHex(name.toCharArray());
            String [] codeType = {"ISO-8859-1", "GB2312", "GBK", "UTF-16", "UTF-8"};
            for (String type : codeType) {
                try {
                    byte [] bytes = name.getBytes(type);
                    toHex(type, bytes);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }    
    }
    
    private static void toHex(String name, byte[] charArray) {
        System.out.print(String.format("%-15s", name + ":"));
        for (int i = 0; i < charArray.length; i++) {
            System.out.print(String.format("%-4x ", charArray[i]));
        }
        System.out.println();
    }

    private static void toHex(char[] charArray) {
        System.out.print(String.format("%-15s","source:"));
        for (int i = 0; i < charArray.length; i++) {
            System.out.print(String.format("%-4x ", (int)charArray[i]));
        }
        System.out.println();
    }
    public static void main(String[] args) {
        encode();
    }

}

 

输出:

 

posted @ 2016-01-03 22:30  cookiehu  阅读(699)  评论(0编辑  收藏  举报