标签:
在编程方面经常遇到字符编码的问题,由于对字符集没有一个系统的认识,总是被乱码搞得一头雾水,这篇博文则是对字符编码方面的进行了一下整理,以便日后复习。在学习字符集的过程中,我主要从字符集的(a)编码方式,(b)占用字节,两个方面来进行分析的。
参考资料:ISO-8859-1
ISO-8859-1(Latin1)编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。下图为ISO-8859-1字符集(包括ASCII字符集,图片来自百科)的编码表,编码方式
在下面代码中,字符串str"úù§ABD"的前三个字符由于不在ASCII编码范围内,故变量asc不能还原为源字符串。由byte数组的长度来看,ISO-8859-1和ASCII为单字节编码。
1 public static void iso(){ 2 String str = "úù§ABD"; 3 try { 4 byte[] ch = str.getBytes("ISO-8859-1"); 5 String asc = new String(ch, "ASCII"); 6 String iso = new String(ch, "ISO-8859-1"); 7 System.out.println(str+" length:"+ch.length+" bytecode:"+byte2hex(ch)+"\nASCII:"+asc +"\nISO-8859-1:"+iso); 8 } catch (UnsupportedEncodingException e) { 9 // TODO Auto-generated catch block 10 e.printStackTrace(); 11 } 12 }
OUTPUT:
úù§ABD length:6 bytecode: fa f9 a7 41 42 44
ASCII:???ABD
ISO-8859-1:úù§ABD
GBK全称《汉字内码扩展规范》,GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。
1 public static void gb(){ 2 String str = "啊aA"; 3 byte[] ch; 4 try { 5 ch = str.getBytes("GB2312"); 6 System.out.println("ch length:"+ch.length+" bytecode:"+byte2hex(ch)); 7 ch = str.getBytes("GBK"); 8 System.out.println("ch length:"+ch.length+" bytecode:"+byte2hex(ch)); 9 } catch (UnsupportedEncodingException e) { 10 // TODO Auto-generated catch block 11 e.printStackTrace(); 12 } 13 }
OUTPUT:
ch length:4 bytecode: b0 a1 61 41
ch length:4 bytecode: b0 a1 61 41
从程序可以看出GB2312,GBK是不定长的,汉字为2个字节,英文字符为一个字节。由于表示汉字或图形符号的“高位字节”的首个bit都为1,而ASCII首个bit为0,而实现了这两种字符集对ASCII的兼容。
ISO-8859-1, ASCII, GBK, GB 2312字符集分析
标签:
原文地址:http://www.cnblogs.com/pzhblog/p/4483491.html