Unicode和UTF-8压语、UTF-16

Unicode 和 UTF-8 、UTF-16是什么關(guān)系呢忍啤?這是我最近好奇的一個(gè)問題加勤。


Unicode

Unicode 是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),包括字符集(包含來自世界各國各地的文字字符)和編碼方案(將每個(gè)字符唯一映射到一個(gè)二進(jìn)制編碼)檀轨。

Unicode 編碼方式

Unicode 的基本元素是碼位(code point)胸竞,共包含1114112個(gè)碼位。碼位通過使用數(shù)值表示参萄,數(shù)值格式為:U+hhhh卫枝,其中每個(gè)h代表一個(gè)十六進(jìn)制數(shù)字。

Unicode 的所有碼位組成了一個(gè)編碼空間讹挎。在Unicode編碼空間校赤,Unicode碼位分為17組編排,每組稱為平面(Plane)筒溃,而每平面擁有65536個(gè)碼位马篮。如下圖所示:

Unicode 編碼空間.png

Unicode 遵守既定規(guī)則把世界上的字符一一映射到碼位中。被使用的碼位怜奖,其碼點(diǎn)值就是對應(yīng)字符的Unicode編碼浑测。如, U+0041 表示拉丁字母 “A”歪玲;U+40000 由于沒使用迁央,不表示任何字符。

截止目前滥崩,才128237 個(gè)碼位被使用——編碼空間的 12% 被賦值岖圈,在后面還有很多空間可應(yīng)對新出現(xiàn)的字符。

Unicode 實(shí)現(xiàn)方式

Unicode 規(guī)定了字符的編碼钙皮,但是沒有規(guī)定如何實(shí)現(xiàn)字符的編碼蜂科。實(shí)現(xiàn)編碼的方式稱為Unicode 轉(zhuǎn)換格式(Unicode Transformation Format,簡稱為UTF)短条。

Unicode 編碼范圍從 U+0000 到 U+10FFFF导匣。對于計(jì)算機(jī)而言,實(shí)現(xiàn)Unicode 編碼的最簡單方式是使用32-bit表示茸时。但是每個(gè)字符使用4個(gè)字節(jié)表示會造成浪費(fèi)贡定。當(dāng)你處理大量文本的時(shí)候,使用 32-bit 存儲 Unicode 字符會占用大量額外存儲屹蚊、內(nèi)存厕氨、帶寬等,因?yàn)榇蠖嘧址牡?和第2個(gè)字節(jié)都是0汹粤。

在日常命斧,Unicode編碼的實(shí)現(xiàn)方式主要有:UTF-8、UTF-16嘱兼。


UTF-8

UTF-8是一種可變長度字符編碼方式国葬,以8-bit 為單元,使用1至4個(gè)字節(jié)為每個(gè)字符編碼芹壕。

UTF-8編碼規(guī)則如下:

Unicode編碼范圍 (十六進(jìn)制) UTF-8編碼占用字節(jié) UTF-8 編碼(二進(jìn)制)
U+0000 - U+007F 1 0xxxxxxx
U+0080 - U+07FF 2 110xxxxx 10xxxxxx
U+0800 - U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
U+10000 - U+10FFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 根據(jù)字符所在編碼范圍汇四,確定其所占字節(jié)數(shù)

  • 單字節(jié)的字符,字節(jié)的第一位設(shè)為0

  • n個(gè)字節(jié)的字符(n>1)踢涌,第一個(gè)字節(jié)的前n位設(shè)為1通孽,第n+1位設(shè)為0,后面字節(jié)的前兩位都設(shè)為10睁壁,這n個(gè)字節(jié)的其余空位填充該字符unicode碼背苦,高位用0補(bǔ)足

下面,以漢字“魚”為例潘明,演示如何實(shí)現(xiàn)UTF-8編碼行剂。

“魚”的Unicode編碼是9C7C1001 1100 0111 1100),根據(jù)上表钳降,9C7C 的UTF-8編碼需要占用3個(gè)字節(jié)厚宰,其格式為1110xxxx 10xxxxxx 10xxxxxx。然后遂填,從“魚”的最后一個(gè)二進(jìn)制位開始铲觉,依次從后向前填入格式中的x,多出的位補(bǔ)0城菊。這樣备燃,就得到“魚”的UTF-8編碼:11101001 10110001 10111100,轉(zhuǎn)換為十六進(jìn)制就是:E9B1BC


UTF-16

UTF-16是一種可變長度字符編碼方式凌唬,以16-bit 為單元并齐,使用2個(gè)或4個(gè)字節(jié)為每個(gè)字符編碼。

UTF-16的編碼規(guī)則如下:

Unicode編碼范圍 (十六進(jìn)制) UTF-16編碼占用字節(jié) UTF-16 編碼(二進(jìn)制)
U+0000 - U+FFFF 2 xxxxxxxx xxxxxxxx
U+10000 - U+10FFFF 4 110110yyyyyyyyyy 110111xxxxxxxxxx
  • 把字符的Unicode編碼記作 U

  • 若U < 0x10000客税,字符的UTF-16編碼就是U對應(yīng)的16位二進(jìn)制:xxxxxxxx xxxxxxxx

  • 若U ≥ 0x10000况褪,則把字符拆分為2部分(U+10000 ~ U+10FFFF的空間大小是2^20),前十位映射到U+D800U+DBFF更耻,后十位映射到U+DC00U+DFFF测垛。具體拆分計(jì)算如下:

  • 計(jì)算U'=U-0x10000,

  • 將U'寫成二進(jìn)制形式:yyyy yyyy yyxx xxxx xxxx,

  • 按照110110yyyyyyyyyy 110111xxxxxxxxxx格式填入跋破,即得到U的UTF-16編碼(二進(jìn)制):110110yyyyyyyyyy 110111xxxxxxxxxx

  • 在基本平面(0x00000xFFFF)內(nèi),U+D800U+DFFF是一個(gè)空段青扔,即這些碼位不對應(yīng)任何字符
  • 輔助平面(0x10000~0x10FFFF)的字符位共有2^20個(gè)
  • U+D800U+DBFF锯七,空間大小是2^10链快;U+DC00U+DFFF,空間大小是2^10眉尸。二者組合起來域蜗,正好可以表示輔助平面的字符。即:輔助平面的字符可以拆分為兩個(gè)基本平面的字符表示——字符前10位映射在U+D800到U+DBFF噪猾,后10位映射在U+DC00到U+DFFF

下面霉祸,以漢字“魚”和字符“??”為例,演示如何實(shí)現(xiàn)UTF-16編碼袱蜡。

“魚”的Unicode編碼是9C7C丝蹭,根據(jù)上表,9C7C < 0x10000 戒劫,其UTF-16編碼就是其Unicode編碼:1001 1100 0111 1100半夷,即0x9C7C。

“??”的Unicode編碼是1D300迅细,根據(jù)上表巫橄,1D300 > 0x10000,然后減去0x10000茵典,得到0xD300湘换,按yyyy yyyy yyxx xxxx xxxx格式寫成二進(jìn)制是:0000 1101 0011 0000 0000,然后按照110110yyyyyyyyyy 110111xxxxxxxxxx格式填入统阿,得到“??”的UTF-16編碼(二進(jìn)制):1101100000110100 1101111100000000彩倚,即0xD834 0xDF00


結(jié)論

回到先前的疑問:Unicode 和 UTF-8 扶平、UTF-16是什么關(guān)系呢帆离?

打個(gè)比喻,它們理論和實(shí)現(xiàn)的關(guān)系:Unicode制定了的理論结澄,UTF-8和UTF-16是具體的實(shí)現(xiàn)方案哥谷。

而更形象的比喻則是:Unicode相當(dāng)于中文, UTF-8、 UTF-16等相當(dāng)于 行書麻献、 楷書们妥、草書等各種書寫方式。


參考資料:
https://zh.wikipedia.org/wiki/Unicode
https://zh.wikipedia.org/wiki/UTF-8
https://zh.wikipedia.org/wiki/UTF-16
http://www.ruanyifeng.com/blog/2014/12/unicode.html
http://blog.jobbole.com/111261/
http://blog.csdn.net/softman11/article/details/6124345
https://www.zhihu.com/question/23374078

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勉吻,一起剝皮案震驚了整個(gè)濱河市监婶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖惑惶,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮盼,死亡現(xiàn)場離奇詭異,居然都是意外死亡带污,警方通過查閱死者的電腦和手機(jī)孕似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刮刑,“玉大人,你說我怎么就攤上這事养渴±拙睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵理卑,是天一觀的道長翘紊。 經(jīng)常有香客問我,道長藐唠,這世上最難降的妖魔是什么帆疟? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宇立,結(jié)果婚禮上踪宠,老公的妹妹穿的比我還像新娘。我一直安慰自己妈嘹,他們只是感情好柳琢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著润脸,像睡著了一般柬脸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毙驯,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天倒堕,我揣著相機(jī)與錄音,去河邊找鬼爆价。 笑死垦巴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的允坚。 我是一名探鬼主播魂那,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稠项!你這毒婦竟也來了涯雅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤展运,失蹤者是張志新(化名)和其女友劉穎活逆,沒想到半個(gè)月后精刷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔗候,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年怒允,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锈遥。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纫事,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出所灸,到底是詐尸還是另有隱情丽惶,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布爬立,位于F島的核電站钾唬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏侠驯。R本人自食惡果不足惜抡秆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吟策。 院中可真熱鬧儒士,春花似錦、人聲如沸檩坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽效床。三九已至睹酌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剩檀,已是汗流浹背憋沿。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沪猴,地道東北人辐啄。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像运嗜,于是被迫代替她去往敵國和親壶辜。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容