Unicode provides a unique number for every character, no matter what the platform, program, or language is.
????????摘自Unicode官方描述诲祸。大意是:Unicode為任意一個符號提供唯一的數(shù)字寇损,可以是平臺、程序新博、語言出現(xiàn)的任意符號售淡。
1、unicode解決什么問題?
????????從根本上說,計算機只處理數(shù)字宵喂。它們通過為每個字符分配一個編號(數(shù)字)來存儲字母和其他字符。在開發(fā)Unicode標準之前柱衔,有許多不同的系統(tǒng)樊破,稱為字符編碼愉棱,用于分配該系統(tǒng)編號唆铐,如ASCII、ISO-8859-1奔滑、GBK等艾岂。這些早期的字符編碼是有局限性的,并沒有涵蓋所有世界語言的字符朋其。即使對于像英語這樣的單一語言王浴,也沒有單一的編碼涵蓋了常用的所有字母脆炎,標點符號和技術符號。諸如中日韓語之類的象形語言是支持這些早期編碼標準的挑戰(zhàn)氓辣;早期的字符編碼也相互沖突秒裕。也就是說,兩個編碼可以對兩個不同的字符使用相同的編號钞啸,或者對同一個字符使用不同的編號几蜻。任何給定的計算機可能必須支持許多不同的編碼。但是体斩,當在計算機和不同編碼之間傳遞數(shù)據(jù)時梭稚,會增加數(shù)據(jù)損壞或錯誤的風險。unicode旨在涵蓋所有字符絮吵,并為其提供唯一編號弧烤。
2、字符集結構說明
????????字符集只是一個規(guī)則集合的名字蹬敲,對應到真實生活中暇昂,字符集就是對某種語言的稱呼。例如:英語粱栖,漢語话浇,日語。對于一個字符集來說(尤其是unicode)要正確編碼轉(zhuǎn)碼一個字符需要三個關鍵元素:
字庫表(character repertoire): 一個相當于所有可讀或者可顯示字符的數(shù)據(jù)庫闹究,字庫表決定了整個字符集能夠展現(xiàn)表示的所有字符的范圍幔崖。
編碼字符集(coded character set): 即用一個編碼值code point來表示一個字符在字庫中的位置,也就是我們前面說到的編號渣淤。unicode的編碼方式與 ISO 10646 的UCS-2相對應赏寇。給每個字符分配一個代碼,而且賦予了一個正式的名字价认。表示一個UCS或Unicode值的十六進制數(shù)通常在前面加上“U+”嗅定,例如“U+0041”代表字符“A”。
字符編碼(character encoding form): 將編碼字符集和實際存儲數(shù)值之間的轉(zhuǎn)換關系用踩,一般來說都會直接將code point的值作為編碼后的值直接存儲渠退。
或許你跟我一樣有過這樣的疑問:字庫表和編碼字符集看來是必不可少的,那既然字庫表中的每一個字符都有一個自己的編號脐彩,直接把編號作為存儲內(nèi)容就好了碎乃。為什么還要多此一舉通過字符編碼把編號轉(zhuǎn)換成另外一種存儲格式呢?
統(tǒng)一字庫表的目的是為了能夠涵蓋世界上所有的字符惠奸,但實際使用過程中會發(fā)現(xiàn)真正用的上的字符相對整個字庫表來說比例非常低梅誓。比如說在使用英語的國家,你可以認為只用ASCII字庫表就能基本滿足基本需求,在存儲上只需要一個字節(jié)即可梗掰;但一些如中文是需要2到3個字節(jié)存儲的嵌言。如果簡單進行編號存儲,那么必須要使用最大字節(jié)長度進行存儲及穗。這樣會造成極大的存儲浪費摧茴。
3、utf-8 與 unicode
????????utf-8的全稱:8-bit Unicode Transformation Format埂陆,從名字上解釋utf-8和Unicode的關系就比較簡單了蓬蝶。Unicode就是上文中提到的編碼字符集,而utf-8就是字符編碼猜惋,即Unicode規(guī)則字庫的一種實現(xiàn)方式丸氛;從結構體系上理解,utf-8只是實現(xiàn)方式的其中一個著摔,其他類似如:utf-16缓窜、utf-32等等
4、ASCII碼和unicode
????????ASCII碼作為早期字符集的存在谍咆,使用面是非常廣泛的禾锤,在字符集結構里,ASCII字符集的編碼字符集和字符編碼是一樣的摹察。unicode在字符收集時恩掷,保留了ASCII碼的編碼字符集(字符和編號的關系)。所以很多時候我們提到的ASCII碼只是一個字典表供嚎,不代表我們使用ASCII字符集黄娘。
5、BMP與supplementary characters
? ? ? ? unicode的編碼方式既然是用utf-16克滴,那么所能表示的范圍是 U+0000 到 U+FFFF 之間逼争,unicode定義了Basic Multilingual Plane (BMP)用于表示這個范圍,更多的Plane定義可以查閱unciode官網(wǎng)劝赔。code point 大于 U+FFFF的字符被稱為supplementary characters誓焦。?supplementary characters是由一對字符組成:?high-surrogates?range, (\uD800-\uDBFF) 和?low-surrogates?range (\uDC00-\uDFFF)。BMP其實已經(jīng)囊括了大部分常用的字符着帽,所以我們其實很少用得到?supplementary characters杂伟。當然了,也用使用場景的仍翰,比如部分中文生僻字赫粥,emoji不屬于BMP部分,你甚至可以在Java歉备,Javascript里獲取這類字符串的長度傅是,會得到意想不到的結果匪燕,有興趣的可以嘗試:"??".length()
結束
unicode是一個世界性課題蕾羊,ta會囊括很多信息喧笔,不太可能一兩篇文章就能說清楚,本文旨在簡單了解在工作中能接觸的部分龟再。謝謝您的閱讀书闸,如有疑問請給我留言,謝謝利凑。
參考:
https://zh.wikipedia.org/zh-hans/Unicode
https://zh.wikipedia.org/zh-hans/UCS