JAVA字符编码测试

几点注意:测试

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

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

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

4,UTF-8采用变长,不一样类型的字符能够由1~6个字节组成(汉字通常3个字节)。UTF-8规则以下:orm

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

 

测试代码:blog

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();
    }

}

 

输出:内存

相关文章
相关标签/搜索