今天因為截取中文字元串的原因,查了下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開頭