一直以來總是對 unicode, utf-8 等編碼知識懵懵懂懂的,尤其是在做專案過程中只要涉及到幾個編碼之間的轉換,都得到網上搜尋一番,根據別人的經驗照葫蘆畫瓢,才能解決問題,但是私底下卻完全不懂在做什麼。我再也不願意重複這種狀態了,於是就花了乙個上午的時間,將這些知識整理了一遍。如果您覺得我的總結有疑問或者錯誤的地方,歡迎討論交流,批評指正。
正題之前,先引入我總結的 unicode 思維導圖來預熱下:
要了解 unicode, 先要從 ascii 碼說起。
ascii 碼
什麼是 ascii 碼?
ascii 碼(american standard code for information interchange)稱為美國標準資訊交換碼。它是基於拉丁字母的一套電腦編碼系統。它定義了乙個用於代表常見字元的字典。
ascii 碼都包含哪些字元?
包括 "a-z"(大小寫都包含),資料"0-9" 以及一些常見的符號。
ascii 碼的侷限在**?
ascii 當初只是為美國英語而設計的,只能顯示 128 個編碼,對其他的語言無能為力。要想顯示其他語言的編碼,還是要使用 unicode。
unicode
什麼是 unicode ?
為了將全世界的文字都統一的記錄下來,並將每個字元都用唯一的數字記錄下來,於是就產生了unicode。
unicode 也稱為 ucs(universal coded character set:國際編碼字元集合) 是乙個字元集合,對世界上大部分的文字系統進行了整理,編碼,使電腦可以用更為簡單的方式來呈現和處理文字。最新的版本 unicode 11.0 已經包含了 137439 個字元。
unicode 的數量之多,如果完全涵蓋它, 需要用 4 個位元組來表示,但是計算機儲存過程中卻不是必須都用 4 個位元組來完成。對於有些字元,尤其是編碼在前面的字元我們也可以通過 1 個或 兩個位元組來節省空間。這就涉及到了 unicode 的實現方式。
unicode 的實現方式有幾種?
unicode 只是乙個字元集合,每個字元用乙個數字來表示,但是這些數字在計算機內採用什麼方式來儲存,是全部都是 4 個位元組,還是 1 到 4 個位元組不等,這就涉及到了字元編碼的概念。
我們說 unicode 有幾種實現方式,也就是在問 unicode 有幾種編碼方式?
unicode 常用的編碼方式有 utf-8, ucs-2, utf-16 三種,另外還有一種 utf-32 雖然不太常用也需要提一下。
unicode 的體系結構是什麼樣的?
unicode 既然能夠儲存那麼多的字元,肯定是有它的儲存規則的,如果使用 16 進製儲存,它的儲存範圍是多少到多少,是否都是直筒式的,從低到高排就可以了?也就是說 unicode 的體系結構是怎麼樣的。
unicode 當前定義其字元的儲存範圍是: 0hex 到 10ffffhex ,共分為 17 個區段,可以儲存 1,114,112 個字元,這對當前 (137439) 來說遠遠足夠了。
其中區段為 0hex 到 ffffhex 稱為 基本多文種平面 bmp (basic multilingual plane),在這個平面中的字元表現形式是 u+ 後面跟 16 進製數。例如 x 字元的 unicode 是 u+0058。
而超出 bmp 範圍的,也就是 10000hex–10ffffhex 這 16 個區段,需要用到 5 到 6 位來表示,如 u+e0001 和 u+10fffd。
utf-8 編碼
utf-8 是使用網際網路上使用最廣泛的 unicode 編碼方式,目前已經占有整個網際網路 92% 的份額。這裡再強調下 utf-8 只是 unicode 的一種實現方式,utf-8 是編碼方式,而 unicode 是字元集合
它是可變長的編碼方式,長度從 1 個位元組到 4 個位元組不等。
它能夠完全相容 ascii 碼,我們知道 ascii 碼 是由 128 個字元組成的,而 unicode 中的前 128 個字元和 ascii 碼都是一一對應的。
ucs-2 編碼
ucs-2 只使用了兩個位元組(16 bit) 來表示字元,也就是說只能表示 65536 個字元,它只能表示 bmp 中的字元。
當前的 unicode 字元數量已遠遠超過了 ucs-2 的數量,因此 ucs-2 雖然還在被好多軟體使用,但它已經過期了。
正因為 ucs-2 編碼依然被許多軟體使用,為了能夠表示出 bmp 以外的平面內的字元,就產生了一種新的編碼 utf-16 編碼。
utf-16 編碼
utf-16 就是為了解決 ucs-2 編碼的問題而生的,它擴充套件自 ucs-2
utf-16 編碼的市場份額和 utf-8 比很小, 在web 頁面中只佔 0.01% 。而且主要在 windows 系統中使用, unix/linux 以及 macos 中很少使用。
utf-32 編碼
utf-32 對 unicode 中的每個字元都用 4 個位元組來表示,占用的空間比其他編碼要多的多,也正是這個原因,人們才用的很少。
小結
既然看到了這裡,您一定對 unicode 有了一些認識吧,請再來回顧下 unicode 的思維導圖,加深下理解。
下面來總結下重點:
python中編碼unicode和utf 8
在python中的字串記憶體中是用unicode進行編碼 python2 s 我愛你python su u 我愛你python s.encode utf 8 traceback most recent call last file line 1,in unicodedecodeerror ascii...
關於unicode和utf8,utf16等
經常有人談起 我如何把gb或unicode字串轉化成utf8字串?這類的問題 這裡按照自己的理解簡要說明一下 unicode是字元編碼的乙個標準,這個和gb2312或者bg5等是對應的,但是unicode又有些比較高階的特殊性,unicode的編碼是固定的,但是表示這個編碼的形式是多種多樣的,比如乙...
Unicode和UTF 8有和區別
關於字符集,之前一直就只知道寫 時成員間統一用utf 8,就不會出現問題,也沒有繼續深入 今天在網上搜了一些資料,總算弄清楚了,下面大致以簡明的方式總結一下 具體 unicode 字符集為每乙個字元分配乙個碼位,例如 知 的碼位是 30693,記作 u 77e5 30693 的十六進製制為 0x77...