其他分享
首页 > 其他分享> > UTF-8字符集的学习

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