一痴奏、什么是UTF-8
UTF-8(8位元蛀骇,Universal Character Set/Unicode Transformation Format)是針對(duì)Unicode的一種可變長(zhǎng)度字符編碼。它可以用來(lái)表示 Unicode 標(biāo)準(zhǔn)中的任何字符读拆,而且其編碼中的第一個(gè)字節(jié)仍與ASCII 相容擅憔,使得原來(lái)處理 ASCII 字符的軟件無(wú)須或只進(jìn)行少部份修改后,便可繼續(xù)使用檐晕。因此暑诸,它逐漸成為電子郵件、網(wǎng)頁(yè)及其他存儲(chǔ)或傳送文字的應(yīng)用中棉姐,優(yōu)先采用的編碼屠列。
總結(jié)下來(lái),UTF8 有如下特點(diǎn):
1)是 unicode 的一種實(shí)現(xiàn)方式伞矩;
2)是一種變長(zhǎng)編碼標(biāo)準(zhǔn);
3)可以與 ASCII 碼有效兼容夏志;
4)應(yīng)用超級(jí)廣泛編碼標(biāo)準(zhǔn)乃坤。
二苛让、UTF-8 的編碼規(guī)則
我們講,UTF-8 是 unicode 的一種實(shí)現(xiàn)方式湿诊,那么狱杰,想要對(duì)一個(gè)字符進(jìn)行 UTF-8 編碼,首先我們要知道這個(gè)字符的 unicode 編碼(字符的 unicode 編碼是約定好的厅须,全球統(tǒng)一不變的)仿畸。拿 unicode 編碼的方式很簡(jiǎn)單,網(wǎng)上有很多 工具 可以做到朗和。
接下來(lái)針對(duì)不同的 unicode 符號(hào)范圍错沽,utf-8 編碼實(shí)際占用的字節(jié)數(shù)可能 1~4 字節(jié)不等??
unicode 符號(hào)范圍 | utf-8 編碼方式
00000000 ~ 0000007F | 0xxxxxxx
00000080 ~ 000007FF | 110xxxxx 10xxxxxx
00000800 ~ 0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx
00010000 ~ 0010FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
總結(jié)下來(lái),針對(duì)UTF8眶拉,編碼規(guī)則其實(shí)只有兩條:
1)單字節(jié)規(guī)則: 對(duì)于 單字節(jié) 的符號(hào)千埃,字節(jié)的第一位(最高位)設(shè)為 0,后面 7 位為這個(gè)符號(hào)的 unicode 碼忆植。
2)n字節(jié)規(guī)則: 對(duì)于 n 字節(jié)的符號(hào)(n>1)放可,第一個(gè)字節(jié)的前 n 位都設(shè)為 1,第 n+1 位設(shè)為 0朝刊,后面字節(jié)的前兩位一律設(shè)為 10耀里。剩下的沒有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的 unicode 碼拾氓。
三冯挎、UTF-8 的編碼舉例
A
-- unicode --> \u0041(1000001)
-- UTF-8 --> 0x41(0 1000001)
真
-- unicode --> \u771f(01110111 00011111)
-- UTF-8 --> 0xe79c9f(1110 0111 10 011100 10 011111)
開
-- unicode --> \u5f00(01011111 00000000)
-- UTF-8 --> 0xe5bc80(1110 0101 10 111100 10 000000)
心
-- unicode --> \u5fc3(01011111 11000011)
-- UTF-8 --> 0e5bf83(1110 0101 10 111111 10 000011)
以 「真」 舉例,我們查到 「真」 的 unicode 編碼是 \u771f( \u 只是unicode 的編碼標(biāo)記痪枫,其后面跟的還是 16 進(jìn)制數(shù))织堂,發(fā)現(xiàn)真的編碼范圍是 0x0800 ~ 0xffff 間,故選擇 3字節(jié) 的編碼方式??
00000800 ~ 0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx
我們將 0x771f 轉(zhuǎn)化為2進(jìn)制(共16位)奶陈,并分成 4易阳、6、6 三組吃粒,填入??編碼方式的「x」 的位置潦俺,得到 1110 0111 10 011100 10 011111,至此完成「真」 的 utf-8 編碼徐勃,轉(zhuǎn)化為 16 進(jìn)制描述即:0xe79c9f事示。
四、體驗(yàn)
那么僻肖,有mac的小伙伴可以試試小編提供的一套基于iOS的編碼理解工程肖爵。可以快速打印出一段文本編碼的數(shù)據(jù)結(jié)果(16進(jìn)制臀脏、2進(jìn)制都有)劝堪,示例如下:
/* 代碼示例 */
cytLogStringData(@"今兒個(gè)真開心冀自!", NSUTF8StringEncoding);
/* 打印結(jié)果 */
今 : 3
e4 bb 8a
11100100 10111011 10001010
兒 : 3
e5 84 bf
11100101 10000100 10111111
個(gè) : 3
e4 b8 aa
11100100 10111000 10101010
真 : 3
e7 9c 9f
11100111 10011100 10011111
開 : 3
e5 bc 80
11100101 10111100 10000000
心 : 3
e5 bf 83
11100101 10111111 10000011
! : 3
ef bc 81
11101111 10111100 10000001
e4 bb 8a e5 84 bf e4 b8 aa e7 9c 9f e5 bc 80 e5 bf 83 ef bc 81
11100100 10111011 10001010 11100101 10000100 10111111 11100100 10111000 10101010 11100111 10011100 10011111 11100101 10111100 10000000 11100101 10111111 10000011 11101111 10111100 10000001
字符數(shù):7
字節(jié)數(shù):21
每個(gè)字符平均占用: 3.00字節(jié)
git地址:https://github.com/chrisYooh/CYEncoding.git
對(duì)你有幫助的話記得幫小編點(diǎn)個(gè) 「Star」 哦秒啦!?????