当前位置:   article > 正文

java ucs2转utf8_UCS-2和UTF-8的互相转换

java ucs-2 转utf-8

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代码 icon_copy.gif

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/924927
推荐阅读
相关标签
  

闽ICP备14008679号