GBK 转UTF-8

public  String convertString(String gbk){
         String utf8 =  "" ;
         try  {
             utf8 =  new  String(gbk2utf8(gbk), "UTF-8" );
         catch  (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
         return  utf8;
     }
 
     public  byte [] gbk2utf8(String chenese) {
         char  c[] = chenese.toCharArray();
         byte [] fullByte =  new  byte [ 3  * c.length];
         for  ( int  i =  0 ; i < c.length; i++) {
             int  m = ( int ) c[i];
             String word = Integer.toBinaryString(m);
 
             StringBuffer sb =  new  StringBuffer();
             int  len =  16  - word.length();
             for  ( int  j =  0 ; j < len; j++) {
                 sb.append( "0" );
             }
             sb.append(word);
             sb.insert( 0 "1110" );
             sb.insert( 8 "10" );
             sb.insert( 16 "10" );
 
             String s1 = sb.substring( 0 8 );
             String s2 = sb.substring( 8 16 );
             String s3 = sb.substring( 16 );
 
             byte  b0 = Integer.valueOf(s1,  2 ).byteValue();
             byte  b1 = Integer.valueOf(s2,  2 ).byteValue();
             byte  b2 = Integer.valueOf(s3,  2 ).byteValue();
             byte [] bf =  new  byte [ 3 ];
             bf[ 0 ] = b0;
             fullByte[i *  3 ] = bf[ 0 ];
             bf[ 1 ] = b1;
             fullByte[i *  3  1 ] = bf[ 1 ];
             bf[ 2 ] = b2;
             fullByte[i *  3  2 ] = bf[ 2 ];
 
         }
         return  fullByte;
     }


顺手把那个大大的转换原理贴出来:
UTF-8 采用变长度字节来表示字符,理论上最多可以到 6 个字节长度(一个字符六个字节)。
UTF-8 编码兼容了 ASC II(0-127), 也就是说 UTF-8 对于 ASC II 字符的编码是和 ASC II 一样的。
对于超过一个字节长度的字符,才用以下编码规范:
左边第一个字节1的个数表示这个字符编码字节的位数,
例如两位字节字符编码样式为为:110xxxxx 10xxxxxx;
三位字节字符的编码样式为:1110xxxx 10xxxxxx 10xxxxxx.;
以此类推,六位字节字符的编码样式为:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。
xxx 的值由字符编码的二进制表示的位填入。只用最短的那个足够表达一个字符编码的多字节串。
例如:
Unicode 字符: 00 A9(版权符号) = 1010 1001,
UTF-8 编码为:11000010 10101001 = 0x C2 0xA9;
字符 22 60 (不等于符号) = 0010 0010 0110 0000,
UTF-8 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0 

UTF-8的编码原理和特性:

U+0000~U+007E 1 _ _ _ _ _ _ _ (7bits)

U+0080~U+07FF 1 1 0_ _ _ _ _ 1 0_ _ _ _ _ _ (11bits)

U+0800~U+FFFF 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ (16bits) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值