標籤:

Unicode 是不是只有兩個位元組,為什麼能表示超過 65536 個字元?


Unicode 目前規劃的總空間是17個平面(平面0至16),0x0000 至 0x10FFFF。每個平面有 65536 個碼點。
你只是大致知道平面0(「Basic Multilingual Plane」,即「BMP」)的 65536 個碼點(即 0x0000 至 0xFFFF)如何編碼,這不是 Unicode 的全部。

  • BMP 的字元是 Unicode 中最基礎和最常用的一部分,以 UTF-16 編碼時使用2位元組,以 UTF-8 編碼時使用1至3位元組。
  • 超出 BMP 的字元以 UTF-16 或 UTF-8 編碼都需要4位元組。
  • 另外還有一個比較少用的編碼形式,UTF-32,它編碼任何 Unicode 字元都需要4個位元組。

Unicode 的基礎是一個編號的字符集,在字符集之上又規定了模塊化的編碼等等技術層次,各種具體的編碼形式並不一致,你說的「Unicode 只有兩個位元組」這句話根本不成立。

這種基礎問題應當直接去看維基百科:Unicode


如果題主是在說 win32 編程那我明確告訴你:
win32 里的 Unicode 等同 UTF-16LE,超過 0xffff 的用四個位元組(代理項對)表示。


簡單一點,常見的Unicode用法是U+0000,四個十六進位=65536,這是當時的限制。
但是如 @梁海 所說,後來擴張到17個Plane,可容納百萬字,U+0000這種方式自然無法呈現。
於是第一面以外的字,就用上了Surrogate Pairs,High Surrogate是D800~DBFF,Low Surrogate是DC00~DFFF,這兩段保留,成雙成對對應到U+10000之後的字。(怎麼轉碼自己算)
不見得所有應用軟體都支援Surrogate Pair,也就無法對應到BMP以外的字。


d800到dfff這段沒字元,是surrogate。BMP外頭還能放1048576個字元,用四個位元組表示,前兩個位元組是d800到dbff之間的1024個碼,叫high surrogate,dc00到dfff又有1024個碼叫low surrogate,放在後頭。


學點編碼知識又不會死:Unicode的流言終結者和編碼大揭秘

剛好看到這篇。也請題主逐字過目。


unicode是指一張表,裡面包含了可能出現的所有字元,每個字元對應一個數字,這個數字稱為碼點(code point),這個數字一般來說是不能直接使用的,於是就有了對於碼點的不同的編碼方式,比如utf-8,utf-16和utf-32,這其中的8,16和32是表示在對應的編碼方式裡面,一個碼點必須是這個數的N倍,比如utf-8的可能是8個bit,16個bit,24個bit,32個bit (8*N),對應的,如果使用utf-16來編碼,則可能出現的是16*N,utf-32類似,utf-8與其他兩種的不同在於可以完全兼容ascii的,因為ascii是8個bit的,所以utf-16和utf-32(至少是16個bit和32個bit)是不可能跟ascii兼容的,而由於目前unicode的表的大小可以算到如果使用utf-32編碼的話,用32個bit就能完全容納下所有的碼點,所以utf-32的特點是每一個字元編碼後都是4個位元組,是定長的,相對的utf-8和utf-16都是變長的


Unicode 給地球上所有的字元一個唯一的編號,
而UTF-8,UTF-16 這類編碼,是這些編號在計算機中的不同表達方式。嚴格來說,Unicode 是沒有「長度」這一說的,它是抽象的字元,只有Unicode的編碼才有具體的位元組長度。


Unicode是一個字元編碼的標準規範,而UTF-8/UTF-16/UTF-32隻是對這個標準規範的具體實現。


早期的Unicode確實是只有16位(最多能表示65536個字元);之後出現了Universal Character Set(UST),採用31位編碼,能表示20多億個字元。因為早期的Unicode過短,而UST過長,所以後來Unicode與UST標準開始合併(當然還有其他原因),使用U+0000-U+10FFFF(總共能編碼[00,10]17*[0000,FFFF]65536個字元,區間內的字元為16進位表示)這個區間來編碼字元(U+是Unicode約定的表示方式,後跟十六進位)。所以現在所指的Unicode不再是只有16位。


Unicode一共有17個平面,開頭是0x0-----0x10;每個平面(0x0000-0xFFFF)都可以表示65535個字元


Unicode只是給字元作編號,不代表計算機里的編碼。

只有在計算機里需要處理時,才會用「編碼」來表示。而Unicode不是編碼,只是代表一個字元的編號


unicode的各種表現形式都是變長編碼,不一定只有兩個位元組。


只有UCS-2編碼是定長的兩個位元組,超過0xFFFF的不能表示,UTF-8/16/32都可以
Unicode不等於UCS-2


推薦閱讀:

為什麼編碼(GBK、Big-5 等)問題這種歷史遺留始終得不到解決?
如何用 Potplayer 消除 .srt 文件的中文字幕亂碼?
如何評價 iOS 8.3 中各種膚色的 Emoji 表情?

TAG:Unicode統一碼 |