中文字元Unicode和UTF-8的編碼為什麼不能一樣?

比如漢字「中」

在Unicode中編碼

01001110 00101101

在UTF-8中為

11100100 10111000 10101101

當初這麼設計是迫不得已的嗎。


Unicode 字符集,定義的是 "一個字元" 和 "一個整數"之間的映射(這樣一個位置在字符集里稱作 code point)

其中,「中」 字對應的那個「整數」 是 01001110 00101101

用 U + 「整數」 這樣的記法表示。

「數」 被分成了很多區,最大的數現在不會超過 0x10FFFF。

參見 http://en.wikipedia.org/wiki/Unicode

----

有了這樣的映射關係,接下來的問題是,如何在計算機里表示這些對應「字元」的「整數」。

於是就有了 UTF-8/16/32 這些具體的編碼方式。

----

UTF-32 最簡單,直接用 32 位整數(4 Byte)表示字元對應的 「整數」,不管是什麼字元,都用 32 位。

----

但是這樣做浪費了很多空間。有些字對應的「數」很小,不需要 32-bits 就可以表示。為此人們制定了UTF-8 和 UTF-16 的「編碼」方式。

----

具體介紹下 UTF-8。參見 http://en.wikipedia.org/wiki/UTF-8

UTF-8 會用 1-6 個位元組表示字符集中的一個「數」。

----

對於在 U + 0000 到 U + 007F 之間的」整數「,用一個 Byte 就可以表示。這個 Byte 的第一位是0,後 7 位 x 對應 code point。

0xxxxxxx

----

對於在 U + 0080 到 U + 07FF 之間的「整數」,用兩個 Byte 表示。

110xxxxx | 10xxxxxx

分別去掉這兩個 Byte 前面的 110 和 10,把剩下的 x 拼起來就是對應字元的那個「數」了

----

中:11100100 10111000 10101101

三個位元組,格式是 3 | 1110xxxx | 10xxxxxx | 10xxxxxx

把 x 對應的位提取出來:

0100 111000 101101

就是

01001110 00101101

----

剩下的不再列舉,題主可以去看 wiki。

----

// UTF - 8

// bits | begin | end | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6

// 7 U + 0000 U + 007F 1 | 0xxxxxxx

// 11 U + 0080 U + 07FF 2 | 110xxxxx | 10xxxxxx

// 16 U + 0800 U + FFFF 3 | 1110xxxx | 10xxxxxx | 10xxxxxx

// 21 U + 10000 U + 1FFFFF 4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx

// 26 U + 200000 U + 3FFFFFF 5 | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx

// 31 U + 4000000 U + 7FFFFFFF 6 | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx


  • 「Unicode」是一整套技術標準,包括字符集、編碼方案等。
  • 沒有「Unicode」這種編碼。
  • Windows 把帶有 BOM 的小端序 UTF-16 稱作「Unicode」,這是錯誤的措詞,不要學。參見:Windows 記事本的 ANSI、Unicode、UTF-8 這三種編碼模式有什麼區別?
  • UTF-16(2位元組或4位元組變長)和 UTF-8(目前用到的為1至4位元組變長)本來就是兩種編碼,只有在不超過 U+007F(ASCII 的範圍)時低位才一樣。自己去維基百科看 UTF-8 的介紹:UTF-8(閱讀能力尚可的話最好去看 Unicode 官方文檔。)


Character set encoding Unicode, gb2312 cp936

UTF-8 Everywhere

字符集和字元編碼(Charset Encoding)

----


Unicode是一個編號的定義,UTF-8 是一種序列化格式約定,用於存儲或者傳輸。

出現各種UTF 編碼是出於

兼容

效率

等各種目的的需要。

比如UTF-8 兼容ASCII的前128個符號,所有保存為ASCII的文檔用UTF-8來處理毫無障礙。

對於大量東亞字元文檔,UTF-16存儲效率比較高,尤其是emoji。

有些早期網路設備只傳送7位每位元組,最高位第8位會被丟棄,所以也有UTF-7的方案。

出於編碼方案的高效處理的目的,盡量讓同組編碼能線性映射,編號時,有時候會空出一些字元區間,這部分有些和某個編碼的擴展標記或者條件有關。


https://zhuanlan.zhihu.com/p/26261762


unicode不是編碼,沒有形式的。utf-8才是編碼形式


Unicode是字符集,而UTF-8是它的一種實現方式。


推薦閱讀:

在可遇見的未來中,有什麼高科技產品將會被淘汰?
怎麼理解《無名師的 GUI 論》?
Linux伺服器重啟(有可能是異常斷電)導致用戶數據損壞的原因是什麼?
把「robust」翻譯為「擼棒」最早起源於哪裡?

TAG:計算機 | Unicode統一碼 | 計算機科學 | 編碼 |