Unicode和UTF-8姻采、UTF-16雅采、UTF-32編碼問題

utf和Unicode編碼到底有什么區(qū)別?是存儲(chǔ)方式不同慨亲?編碼方式不同婚瓜?它們看起來似乎很相似,但是實(shí)際上他們并不是同一層次的概念刑棵。
Unicode編碼是國際組織設(shè)計(jì)的編碼方法巴刻,用于解決各個(gè)國家地區(qū)不同編碼方式造成的譯碼困難。所以先從Unicode的由來講起蛉签。

Unicode的產(chǎn)生

1.我們知道計(jì)算機(jī)其實(shí)只認(rèn)識(shí)0101這樣的字符串胡陪,當(dāng)然了讓我們看這樣的01串會(huì)比較頭暈,所以為了描述簡單一般都用八進(jìn)制碍舍、十進(jìn)制柠座、十六進(jìn)制表示。各種進(jìn)制都是等價(jià)的片橡。其它像文字圖片音視頻等計(jì)算機(jī)也是不認(rèn)識(shí)的妈经,為了讓計(jì)算機(jī)能表示這些信息就必須轉(zhuǎn)換成一些數(shù)字,必須按照一些規(guī)則轉(zhuǎn)換。
比如:剛開始的時(shí)候就有ASCII字符集(American Standard Code for Information Interchange吹泡, 美國信息交換標(biāo)準(zhǔn)碼)它使用7 bits來表示一個(gè)字符骤星,總共表示128個(gè)字符,我們一般都是用字節(jié)(byte:即8個(gè)01串)來作為基本單位爆哑。當(dāng)時(shí)一個(gè)字節(jié)來表示字符時(shí)第一個(gè)bit總是0洞难,剩下的七個(gè)字節(jié)就來表示實(shí)際內(nèi)容。后來IBM公司在此基礎(chǔ)上進(jìn)行了擴(kuò)展泪漂,用8bit來表示一個(gè)字符廊营,總共可以表示256個(gè)字符。也就是當(dāng)?shù)谝粋€(gè)bit是0時(shí)仍表示之前那些常用的字符萝勤,當(dāng)為1時(shí)就表示其他補(bǔ)充的字符露筒。

  1. 英文字母再加一些其他標(biāo)點(diǎn)字符之類的也不會(huì)超過256個(gè),一個(gè)字節(jié)表示足夠了敌卓。但其他一些文字不止這么多 慎式,像漢字就上萬個(gè),于是又出現(xiàn)了其他各種字符集趟径。這樣不同的字符集交換數(shù)據(jù)時(shí)就有問題了瘪吏,可能你用某個(gè)數(shù)字表示字符A,但另外的字符集又是用另外一個(gè)數(shù)字表示A蜗巧。為了適應(yīng)全球化的發(fā)展掌眠,便于不同語言之間的兼容交互,而ASCII不再能勝任此任務(wù)了幕屹。所以就出現(xiàn)了Unicode和ISO這樣的組織來統(tǒng)一制定一個(gè)標(biāo)準(zhǔn)蓝丙,任何一個(gè)字符只對(duì)應(yīng)一個(gè)確定的數(shù)字。ISO取的名字叫UCS(Universal Character Set)(ucs-2對(duì)應(yīng)utf-16,ucs-4對(duì)應(yīng)utf-32)望拖,Unicode取的名字就叫unicode了渺尘。

UTF-8、UTF-16和UTF-32的產(chǎn)生

Unicode為世界上所有字符都分配了一個(gè)唯一的數(shù)字編號(hào)说敏,這個(gè)編號(hào)范圍從 0x000000 到 0x10FFFF (十六進(jìn)制)鸥跟,有 110 多萬(Unicode有兩個(gè)版本,第一個(gè)版本有65536個(gè)數(shù)字盔沫,第二個(gè)版本才有110多萬)医咨,每個(gè)字符都有一個(gè)唯一的 Unicode 編號(hào),這個(gè)編號(hào)一般寫成 16 進(jìn)制架诞,在前面加上 U+腋逆。例如:“馬”的 Unicode 是U+9A6C。
Unicode 就相當(dāng)于一張表侈贷,建立了字符與編號(hào)之間的聯(lián)系。


image.png

它是一種規(guī)定,Unicode 本身只規(guī)定了每個(gè)字符的數(shù)字編號(hào)是多少俏蛮,并沒有規(guī)定這個(gè)編號(hào)如何存儲(chǔ)撑蚌。
有的人會(huì)說了,那我可以直接把 Unicode 編號(hào)直接轉(zhuǎn)換成二進(jìn)制進(jìn)行存儲(chǔ)搏屑,是的争涌,你可以,但是這個(gè)就需要人為的規(guī)定了辣恋,而 Unicode 并沒有說這樣弄亮垫,因?yàn)槌四氵@種直接轉(zhuǎn)換成二進(jìn)制的方案外,還有其他方案伟骨,接下來我們會(huì)逐一看到饮潦。
編號(hào)怎么對(duì)應(yīng)到二進(jìn)制表示呢?有多種方案:主要有 UTF-8携狭,UTF-16继蜡,UTF-32。

1.UTF-32

這個(gè)就是字符所對(duì)應(yīng)編號(hào)的整數(shù)二進(jìn)制形式逛腿,四個(gè)字節(jié)稀并。這個(gè)就是直接轉(zhuǎn)換。 比如馬的 Unicode 為:U+9A6C单默,那么直接轉(zhuǎn)化為二進(jìn)制碘举,它的表示就為:1001 1010 0110 1100。
這里需要說明的是搁廓,轉(zhuǎn)換成二進(jìn)制后計(jì)算機(jī)存儲(chǔ)的問題引颈,我們知道,計(jì)算機(jī)在存儲(chǔ)器中排列字節(jié)有兩種方式:大端法和小端法枚抵,大端法就是將高位字節(jié)放到低地址處线欲,比如 0x1234, 計(jì)算機(jī)用兩個(gè)字節(jié)存儲(chǔ),一個(gè)是高位字節(jié) 0x12,一個(gè)是低位字節(jié) 0x34汽摹,它的存儲(chǔ)方式為下:

在這里插入圖片描述

UTF-32 用四個(gè)字節(jié)表示李丰,處理單元為四個(gè)字節(jié)(一次拿到四個(gè)字節(jié)進(jìn)行處理),如果不分大小端的話逼泣,那么就會(huì)出現(xiàn)解讀錯(cuò)誤趴泌,比如我們一次要處理四個(gè)字節(jié) 12 34 56 78,這四個(gè)字節(jié)是表示 0x12 34 56 78 還是表示 0x78 56 34 12拉庶?不同的解釋最終表示的值不一樣嗜憔。
我們可以根據(jù)他們高低字節(jié)的存儲(chǔ)位置來判斷他們所代表的含義,所以在編碼方式中有 UTF-32BE 和 UTF-32LE氏仗,分別對(duì)應(yīng)大端和小端吉捶,來正確地解釋多個(gè)字節(jié)(這里是四個(gè)字節(jié))的含義。

2.UTF-16

UTF-16 使用變長字節(jié)表示
① 對(duì)于編號(hào)在 U+0000 到 U+FFFF 的字符(常用字符集),直接用兩個(gè)字節(jié)表示呐舔。
② 編號(hào)在 U+10000 到 U+10FFFF 之間的字符币励,需要用四個(gè)字節(jié)表示。
同樣珊拼,UTF-16 也有字節(jié)的順序問題(大小端)食呻,所以就有 UTF-16BE 表示大端,UTF-16LE 表示小端澎现。

3.UTF-8

UTF-8 就是使用變長字節(jié)表示,顧名思義仅胞,就是使用的字節(jié)數(shù)可變,這個(gè)變化是根據(jù) Unicode 編號(hào)的大小有關(guān)剑辫,編號(hào)小的使用的字節(jié)就少干旧,編號(hào)大的使用的字節(jié)就多。使用的字節(jié)個(gè)數(shù)從 1 到 4 個(gè)不等揭斧。
UTF-8 的編碼規(guī)則是:

① 對(duì)于單字節(jié)的符號(hào)莱革,字節(jié)的第一位設(shè)為 0,后面的7位為這個(gè)符號(hào)的 Unicode 碼讹开,因此對(duì)于英文字母盅视,UTF-8 編碼和 ASCII 碼是相同的。

② 對(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 碼 赏半。

舉個(gè)例子:比如說一個(gè)字符的 Unicode 編碼是 130,顯然按照 UTF-8 的規(guī)則一個(gè)字節(jié)是表示不了它(因?yàn)槿绻且粋€(gè)字節(jié)的話前面的一位必須是 0)淆两,所以需要兩個(gè)字節(jié)(n = 2)断箫。
根據(jù)規(guī)則,第一個(gè)字節(jié)的前 2 位都設(shè)為 1秋冰,第 3(2+1) 位設(shè)為 0仲义,則第一個(gè)字節(jié)為:110X XXXX,后面字節(jié)的前兩位一律設(shè)為 10剑勾,后面只剩下一個(gè)字節(jié)埃撵,所以后面的字節(jié)為:10XX XXXX。
所以它的格式為 110XXXXX 10XXXXXX 虽另。

下面我們來具體看看具體的 Unicode 編號(hào)范圍對(duì)應(yīng)的 UTF-8 二進(jìn)制格式

在這里插入圖片描述

那么對(duì)于一個(gè)具體的 Unicode 編號(hào)暂刘,具體怎么進(jìn)行 UTF-8 的編碼呢?
首先找到該 Unicode 編號(hào)所在的編號(hào)范圍捂刺,進(jìn)而可以找到與之對(duì)應(yīng)的二進(jìn)制格式谣拣,然后將該 Unicode 編號(hào)轉(zhuǎn)化為二進(jìn)制數(shù)(去掉高位的 0)募寨,最后將該二進(jìn)制數(shù)從右向左依次填入二進(jìn)制格式的 X 中,如果還有 X 未填森缠,則設(shè)為 0 绪商。
比如:“馬”的 Unicode 編號(hào)是:0x9A6C,整數(shù)編號(hào)是 39532辅鲸,對(duì)應(yīng)第三個(gè)范圍(2048 - 65535),其格式為:1110XXXX 10XXXXXX 10XXXXXX腹殿,39532 對(duì)應(yīng)的二進(jìn)制是 1001 1010 0110 1100独悴,將二進(jìn)制填入進(jìn)去就為:
11101001 10101001 10101100 。

在這里插入圖片描述
在這里插入圖片描述

由于 UTF-8 的處理單元為一個(gè)字節(jié)(也就是一次處理一個(gè)字節(jié))锣尉,所以處理器在處理的時(shí)候就不需要考慮這一個(gè)字節(jié)的存儲(chǔ)是在高位還是在低位刻炒,直接拿到這個(gè)字節(jié)進(jìn)行處理就行了,因?yàn)榇笮《耸轻槍?duì)大于一個(gè)字節(jié)的數(shù)的存儲(chǔ)問題而言的自沧。

參考博文

  1. utf-8和Unicode的區(qū)別
  2. Unicode 和 UTF-8坟奥、UTF-16、UTF-32之間的關(guān)系
  3. (Unicode) UTF-8與UTF-16之間轉(zhuǎn)換
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拇厢,一起剝皮案震驚了整個(gè)濱河市爱谁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孝偎,老刑警劉巖访敌,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衣盾,居然都是意外死亡寺旺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門势决,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阻塑,“玉大人,你說我怎么就攤上這事果复〕旅В” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵据悔,是天一觀的道長传透。 經(jīng)常有香客問我,道長极颓,這世上最難降的妖魔是什么朱盐? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮菠隆,結(jié)果婚禮上兵琳,老公的妹妹穿的比我還像新娘狂秘。我一直安慰自己,他們只是感情好躯肌,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布者春。 她就那樣靜靜地躺著,像睡著了一般清女。 火紅的嫁衣襯著肌膚如雪钱烟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天嫡丙,我揣著相機(jī)與錄音拴袭,去河邊找鬼。 笑死曙博,一個(gè)胖子當(dāng)著我的面吹牛拥刻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播父泳,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼般哼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惠窄?” 一聲冷哼從身側(cè)響起蒸眠,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睬捶,沒想到半個(gè)月后黔宛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擒贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年臀晃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片介劫。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徽惋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出座韵,到底是詐尸還是另有隱情险绘,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布誉碴,位于F島的核電站宦棺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏黔帕。R本人自食惡果不足惜代咸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望成黄。 院中可真熱鬧呐芥,春花似錦逻杖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滨攻,卻和暖如春够话,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背光绕。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工更鲁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奇钞。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像漂坏,于是被迫代替她去往敵國和親景埃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361