java编程

UTF-8规则怎么将Unicode中的汉字编码成二进制

字号+ 作者:zhuawa 来源:原创 2019-01-21 18:00 我要评论( )

import java.io.UnsupportedEncodingException; public class UTFTest { /**首先说明 * \u0800 - \uFFFF 这个区间内的unicode,以utf-8编码存储,都是占3个字节, * 所以上述区间内的汉字, * 全部都是3个字节 * 但utf-8本身支持1-6个字节,用以覆盖需要用4

import java.io.UnsupportedEncodingException;

public class UTFTest {

    /**
    *    0X4E00到0X9FA5 而是 \(u) 4EOO到\(u)  9FA5  括号去掉。注意是无符号位
  *  \u0800 - \uFFFF 这个区间内的unicode,以utf-8编码存储,都是占3个字节,所以上述区间内的汉字,
   *   全部都是3个字节
    *    但utf-8本身支持1-6个字节,用以覆盖需要用4个字节来表示的所有unicode字符
    */
    public static void main(String[] args) throws UnsupportedEncodingException {
        /**
         * 如“啊”的GBK编码为:0xB0,0xA1。“命”的GBK编码为:0xC3,0xFC
         * 第一个是区,第二个是指定位置。无符号位
         */
        System.out.println(getBiniary("啊", "GBK").toString());
        System.out.println(getBiniary("好", "UTF-8").toString());
        byte[] by="好".getBytes("UTF-8");
        //如果直接使用此Integer.toBinaryString(b) ;字节b将会直接被转化成32位整型,然后转化成
        for(byte b:by){
            Integer bi = Integer.valueOf(b);
            System.out.print(Integer.toBinaryString(bi) + " ");
            }
        System.out.println();
        for(byte b:by){
            System.out.print(b + " ");
        }
        System.out.println();
        System.out.println(new String(by));
        //在计算机中最高位为符号位
        //源码:第一位符号位,其他位为值,转化过程中,不需要对符号位处理。
        //反码 : 除符号位外其他位取反 如:10000001 其反码:11111110
        //补码:反码 + 1
        //在计算机中,数值是以二进制的补码形式存在,正数的补码就是其本身,负数的补码是其反码+1;
        //例如,-1 正常表示为 10000001 ,但计算机中为补码(取反+1) 11111110+1 = 11111111
        //反过来 ,则转化则 -1 取反
        //-27  转化成2进至10011011  (符号位为1,其余位为27转化过来 11011),减1 (10011010),
        //再取反(11100101)则为原数值
        //则 -27 在计算机中为二进制11100101
        //==========UTF-8 转化=============
        // -27 -91 -67 转化成二进制为  11100101 10100101 10111101
        //“好” 在计算机中二进制为 11100101 10100101 10111101   
        //根据UTF-8 编码规则
        /*
    * A:U+ 0000 ~ U+ 007F: 0XXXXXXX
    * B:U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
    * C:U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
    * D:U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
         *  "好" unicode 为 597d  二进制为:0101 1001 0111 1101
         *  按C则对应的UTF-8为:11100101 10100101 10111101  
         *  翻译过来正确 点赞
         *  如果 
0101 1001 0111 1101 为方便查看, 4二进制一转16进制;比如  0101 -> 5 ,1001->9 ,0111->7,1101->D
         */
        String bi = Integer.toBinaryString((0x01 & 0xFF) );
        //当指定进制0x得时候,一但指定0x ,后面每个数字都是4位
        //这样输出来得是补码
        System.out.println(Integer.toBinaryString((Integer.valueOf(-4) & 0xFF) + 0x100).substring(1));
    //UTf
    
        byte[] ss="你好啊".getBytes("GBK");
        System.out.println(getBiniary(new String(ss,"GBK"),"GBK"));
        System.out.println(new String(ss,"UTF-8"));
        byte[] nulls = new byte[]{(byte) 130,(byte)(64)};
        System.out.println("|"+new String(nulls,"GBK")+"|");
    }
    
    
    public static StringBuilder getBiniary(String s,String charset) throws UnsupportedEncodingException{
        StringBuilder sb= new StringBuilder();
        byte[] bytes = s.getBytes(charset);
        for(byte b:bytes){
                        //因为一个字节是8位,所以要控制位数在8位。不然
            //b是字符里得字节。和0xFF做与运算。求出一个字节得1值。将高位全部转化位0
                        //再加 0x100 ,将b & 0xFF的到得结果统一控制再9位,然后再截取后8位,位当前字节值.控制在8位
            sb. append(Integer.toBinaryString((b & 0xFF) + 0x100).substring(1)).append(" ");
                }
        return sb;
    }
    
    //一般系统中存在一些情况。GBK强转UTF-8或者GBK强转UTF-8
    //当GBK强转UTF-8之后。GBK编码得字节将会导致在Unicode中找不到对应得编码。然后系统就输出了问号
    //当UTF-8转GBK,可以找到对应得编码,其实这个时候不是乱码。只是找到得是很难见到得汉字,而且笔画很乱。因为UTF-8 汉字编码会有1110开头。定位得区号会到GBK得E区。所以会有很多奇怪得汉字转出来,看着就像//乱码了
    
    /*
运行结果

         10110000 10100001
        11100101 10100101 10111101
        11111111111111111111111111100101 11111111111111111111111110100101 11111111111111111111111110111101
        -27 -91 -67
        好
        11111100
        11000100 11100011 10111010 11000011 10110000 10100001
        ��ð�
        |侤|
     */
}



转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • UTF-8 和 unicode 区分

    UTF-8 和 unicode 区分

    2016-08-30 16:37

网友点评
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)