UTF-8字符集的学习
作者:互联网
今天因为截取中文字符串的原因,查了下UTF-8字符集的资料,发现之前记忆的知识点有误,之前一直以为UTF-8中英文是1个字节,其他语言的字符是3个字节,查完资料后才发现UTF-8字符集是一种变长字符集,每个字符占用字节从1个到6个不等,恰好英文字符使用1个字节,中文字符使用3个字节,而且还知道了UTF-8字符集中如何辨认一个字符应用了多少字节,这对根据字节数组来统计字符极有意义。
UTF-8编码规则
如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8转换表表示如下:
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
知道这个规则后,忍不住自已写代码验证了一番,在UTF-8编码中,汉字编码为0x4E00到0x9FA5,共计20902个汉字,后期GB18030标准中又增补了0x3400-0x4db5的6582个汉字,共计汉字27484个,下面对这27484个汉字展示其UTF-8编码规则下的二进制格式:
int cnt = 0;
for(int i=0x3400;i<=0x9FA5;i++){
if(i>0x4DB5 && i<0x4E00){
continue;
}
String c = String.valueOf((char)i);
System.out.print(Integer.toHexString(i));
System.out.print(c);
byte[] bytes = c.getBytes();
for(int j=0;j<bytes.length;j++){
byte b = bytes[j];
System.out.print(Integer.toBinaryString(b).substring(24));
System.out.print(" ");
}
System.out.println();
cnt++;
}
System.out.println("汉字一共"+cnt+"个");
部分输出结果:
3400㐀11100011 10010000 10000000
3401㐁11100011 10010000 10000001
3402㐂11100011 10010000 10000010
3403㐃11100011 10010000 10000011
3404㐄11100011 10010000 10000100
3405㐅11100011 10010000 10000101
3406㐆11100011 10010000 10000110
3407㐇11100011 10010000 10000111
3408㐈11100011 10010000 10001000
3409㐉11100011 10010000 10001001
340a㐊11100011 10010000 10001010
340b㐋11100011 10010000 10001011
......
4db1䶱11100100 10110110 10110001
4db2䶲11100100 10110110 10110010
4db3䶳11100100 10110110 10110011
4db4䶴11100100 10110110 10110100
4db5䶵11100100 10110110 10110101
4e00一11100100 10111000 10000000
4e01丁11100100 10111000 10000001
4e02丂11100100 10111000 10000010
4e03七11100100 10111000 10000011
4e04丄11100100 10111000 10000100
4e05丅11100100 10111000 10000101
4e06丆11100100 10111000 10000110
4e07万11100100 10111000 10000111
......
9fa0龠11101001 10111110 10100000
9fa1龡11101001 10111110 10100001
9fa2龢11101001 10111110 10100010
9fa3龣11101001 10111110 10100011
9fa4龤11101001 10111110 10100100
9fa5龥11101001 10111110 10100101
汉字一共27484个
从输出结果中可以看到,目前汉字编码区间确实都在3个字节范围内,而且首字节的高位为1110,其他字节的高位均是10开头
标签:UTF,字节,11100011,字符集,学习,10010000,10xxxxxx,11100100 来源: https://blog.csdn.net/shuaijie506/article/details/100072562