中文字元Unicode和UTF-8的編碼為什麼不能一樣?
01-16
比如漢字「中」
在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-8UTF-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 cp936UTF-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統一碼 | 計算機科學 | 編碼 |