UTF 8字符集的學習

2021-09-26 12:41:29 字數 2316 閱讀 1964

今天因為擷取中文字串的原因,查了下utf-8字符集的資料,發現之前記憶的知識點有誤,之前一直以為utf-8中英文是1個位元組,其他語言的字元是3個位元組,查完資料後才發現utf-8字符集是一種變長字符集,每個字元占用位元組從1個到6個不等,恰好英文本元使用1個位元組,中文字元使用3個位元組,而且還知道了utf-8字符集中如何辨認乙個字元應用了多少位元組,這對根據位元組陣列來統計字元極有意義。

如果只有乙個位元組則其最高二進位制位為0;如果是多位元組,其第乙個位元組從最高位開始,連續的二進位制位值為1的個數決定了其編碼的位元組數,其餘各位元組均以10開頭。utf-8轉換表表示如下: 

1位元組 0******x 

2位元組 110***xx 10****** 

3位元組 1110***x 10****** 10****** 

4位元組 11110*** 10****** 10****** 10****** 

5位元組 111110xx 10****** 10****** 10****** 10****** 

6位元組 1111110x 10****** 10****** 10****** 10****** 10****** 

知道這個規則後,忍不住自已寫**驗證了一番,在utf-8編碼中,漢字編碼為0x4e00到0x9fa5,共計20902個漢字,後期gb18030標準中又增補了0x3400-0x4db5的6582個漢字,共計漢字27484個,下面對這27484個漢字展示其utf-8編碼規則下的二進位制格式:

int cnt = 0;

for(int i=0x3400;i<=0x9fa5;i++)

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部分輸出結果:

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

tinyxml解析UTF 8字符集的xml

今天在程式中遇到,當通訊的xml裡面含有中文字元的時候,tinyxml解析時總是報錯,不能進行解析,查詢原因後發現是tinyxml在解析utf 8字符集的xml時,需要特殊指定字符集才行,下面是對於讀取檔案和直接解析字串所需的tinyxml函式的使用方式。一 需解析的xml 21 0全天侯模板 11...

mysql中的utf8字符集與標準UTF 8的區別

儘管字面上非常相似,但mysql的utf 8的覆蓋範圍僅僅是所有utf 8字符集的一部分。這非常容易誤導初學者。utf 8是ucs字符集的一種編碼方式,可能將乙個字元編碼為1個位元組,2個位元組,3個位元組,或者4個位元組。編碼為1個位元組的字元就是ascii碼 有時稱為latin文字元號 包含了拉...

字符集GBK公升級UTF8

在生產環境中,資料庫字符集因為各種原因需要公升級,比如為了支援漢字,從latin1字符集公升級到gbk,後面為了支援多個語言文字,需要將gbk公升級到utf8等。遷移過程網上有很多,我今天主要想講下字符集轉換後,可能對業務產生的影響,我以gbk轉換到utf8為例說明。主要有兩點 漢字在gbk編碼中佔...