天天看點

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開頭