赞
踩
UCS-2是内码,而UTF-8则是它的实现方式。每一个字节都有8个位,而对于UTF-8来说,每一个字节的前两位尤为重要,按照前两位的不同,一共有四种排列组合:00xxxxxx,01xxxxxx,10xxxxxx,11xxxxxx。
按照UTF-8标准,
(1)所有以0开始的字节,都与原来的ASCII码兼容,也就是说,0xxxxxxx不需要额外转换,就是我们平时用的ASCII码。
(2)所有以10开始的字节,都不是每个UNICODE的第一个字节,都是紧跟着前一位。例如:10110101,这个字节不可以单独解析,必须通过前一个字节来解析,如果前一个也是10开头,就继续前嗍。
(3)所有以11开始的字节,都表示是UNICODE的第一个字节,而且后面紧跟着若干个以10开头的字节。如果是110xxxxx(就是最左边的0的左边有2个1),代表后面还有1个10xxxxxx;如果是1110xxxx(就是最左边的0的左边有3个1),代表后面还有2个10xxxxxx;以此类推,一直到1111110x。
具体的表格如下:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
(很明显,以11开头的,最左边的0左边有多少个1,那这个UCS的UTF-8的表示长度就有多少个字节)
上面是用6个字节,最多可以表示2 ^ 31个的字符,实际上,只有UCS-4才有这么多的字符,对于UCS-2,仅仅有2 ^ 16个字符,只需要三个字节就可以,也就是说,只需要用到下面的格式:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
大家可以试一下下面的program,来看看UTF-8的每个字节。
Java代码
packagecom.ray.utf8;
importjava.io.UnsupportedEncodingException;
publicclassUTF8Tester {
privatestaticString toBin(intn) {
StringBuilder b =newStringBuilder();
if(n 0) n +=256;
for(inti =7; i >=0; i--) {
if(1== ((n >> i) &1)) {
b.append('1');
}else{
b.append('0');
}
}
returnb.toString();
}
privatestaticString HEX ="0123456789ABCDEF";
privatestaticString toHex(intn) {
StringBuilder b =newStringBuilder();
if(n 0) n +=256;
b.append(HEX.charAt(n >>4));
b.append(HEX.charAt(n &0x0F));
returnb.toString();
}
privatestaticvoidprintUTF8(charch)throwsUnsupportedEncodingException {
String unicode = toHex(ch >>8) + toHex(ch &0xFF);
String unicodeB
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。