美文网首页
java获取指定汉字的utf-8字符对照表中的码值

java获取指定汉字的utf-8字符对照表中的码值

作者: 屎倒淋头还嚼便 | 来源:发表于2023-10-14 18:45 被阅读0次
    public static void main(String[] args) throws UnsupportedEncodingException {
            byte[] bytes = "中".getBytes("utf-8");
            System.out.println("【中】字的字节数组编码规则值:"+Arrays.toString(bytes)); // [-28, -72, -83]
            
            StringBuilder hexStringBuffer = new StringBuilder();
            for (byte b : bytes) {
                String hexString = String.format("%02X", b);
                hexStringBuffer.append(hexString);
            }
            String hexString = hexStringBuffer.toString();
            System.out.println("【中】字的字节数组的16进制串编码规则值:"+hexString); // E4B8AD
            
            BigInteger bigInteger = new BigInteger(hexString,16);
            String str = bigInteger.toString(2);
            System.out.println("【中】字的16进制串转二进制数编码规则值:"+str); // 111001001011100010101101
            
            /** 
             * 根据utf-8编码规则,得到【中】的utf8二进制编码值为:100111000101101
             * 【中】二进制编码值:           11100100 10111000 10101101
             * utf8编码规则:                1110xxxx 10xxxxxx 10xxxxxx
             * 【中】在u8对应表中的二进制编码值:   0100   111000   101101(0100111000101101)
             */
            int decimalNumber = Integer.parseInt("100111000101101", 2);
            String hexString2 = Integer.toHexString(decimalNumber);
            System.out.println("【中】字在utf-8字符集中的16进制编码值为:" + hexString2); // 4e2d
            /**
             *  个人理解:
             *  4e2d:utf-8对照表中【中】字的编码值
             *  E4B8AD:utf-8代码中【中】字的编码规则值
             *  不知道有没有四个字节的汉字,这里默认是三个汉字
             *  
             *  原文链接:https://blog.csdn.net/xuechanba/article/details/121253131
             *  UTF-8的编码规则:
                1、对于单字节的字符,字节的第一位设为0,后面七位为这个字符的Unicode码。
                因此对于英文字符,UTF-8编码和ASCII码是相同的。
                
                2、对于n字节的字符(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的
                前两位一律设为10。剩下的没有提及的二进制位,全部为这个字符的Unicode编码。
                
                UTF-8每次传送8位数据,并且是一种可变长的编码格式
                具体来说,是怎么的可变长呢.
                
                分为四个区间:
                0x0000 0000 至 0x0000 007F:0xxxxxxx
                0x0000 0080 至 0x0000 07FF:110xxxxx 10xxxxxx
                0x0000 0800 至 0x0000 FFFF:1110xxxx 10xxxxxx 10xxxxxx
                0x0001 0000 至 0x0010 FFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
                
                UTF-8解码过程:
                
                对于采用UTF-8编码的任意字符B
                
                如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;
                
                如果B的前两位为1,第三位为0,则B为一个非ASCII字符,该字符由多个字节表示,
                并且该字符由两个字节表示;
                
                如果B的前三位为1,第四位为0,则B为一个非ASCII字符,该字符由多个字节表示,
                并且该字符由三个字节表示;
                
                比如汉字 “王”,它的二进制形式为: 0x0000 738B,属于第三区间,
                0x0000 738B - 00000000 00000000 01110011 10001011,
                第三区间的编码是 1110xxxx 10xxxxxx 10xxxxxx
                把x都给替换,则最终"王"字对应的Unicode的编码是
                11100111 10001110 10001011
                转换成16进制 0xe7 0x8e 0x8b
                
                如果B的前四位为1,第五位为0,则B为一个非ASCII字符,该字符由多个字节表示,
                并且该字符由四个字节表示;
             *  
             */
            // 另外代码中指定字符怎么从gbk转成u8?
            // 例如:
            byte[] bytes2 = "中".getBytes("gbk");
            System.out.println(Arrays.toString(bytes2)); // [-42, -48]
            byte[] bs = {-42, -48};
            String name = new String(bs,"gbk"); 
            System.out.println(name);// 中
            // 注意,一个字符串变量(这个字符)不属于任何字符集,只能在getBytes方法中指定字符集之后,获取到的才是字符在指定字符集中对应的编码值
            byte[] bytes3 = name.getBytes("utf-8");
            System.out.println(Arrays.toString(bytes3)); // [-28, -72, -83]
    
        }
    

    相关文章

      网友评论

          本文标题:java获取指定汉字的utf-8字符对照表中的码值

          本文链接:https://www.haomeiwen.com/subject/whmzbdtx.html