因爲計算機語言是一組高低電平,高電平表明1,低電平表明0,計算機中的全部信息都是以二進制代碼的形式存在的,不管是文字、圖片、聲音,仍是影像、遊戲......python
相似於摩斯電碼,爲了讓人們能看懂這些二進制代碼,美國人最早制定了一種編碼規則——ASCII碼,用於理解二進制代碼到底表明的是哪些字符,ASCII碼使用指定的7個二進制位組合,這些組合所能表示的128個整數用來表明大小寫字母、0到9的數字、控制字符、通訊專用字符、空格符、運算符號、標點符號等的編號,經過編號能夠找到一一對應的字符,ASCII碼一般會額外使用一個擴充的二進制位,雖然這個二進制位可能並不表明任何意思,可是能夠方便以一個字節的方式存儲每一個字符ui
在美國計算機裝的英文系統上的編碼表多是ASCII碼也多是EBCDIC碼,而編碼格式也必定是ASCII編碼格式,才能在輸出文本和打開文本時不出現亂碼編碼
ASCII碼只能知足英文在計算機上通訊的須要,爲了擴充ASCII編碼,也爲了知足其餘語言的通訊須要,各國也都制定了各自的屬於本國語言的字符編碼來方便在計算機上通訊,例如我國的GBKcode
在GBK編碼體系下,有些字符使用雙字節組合來表示,須要知道GBK編碼標準兼容GB2312,GB2312採用了二維矩陣編碼法對全部字符進行編碼,它是一個94行94列的方陣,對每一行稱爲一個「區」,每一列稱爲一個「位」,而後將全部字符依照編碼表的規律填寫到方陣中。這樣全部的字符在方陣中都有一個惟一的位置,這個位置能夠用區號、位號合成表示,稱爲字符的區位碼。如第一個漢字「啊」出如今第16區的第1位上,其區位碼爲1601。由於區位碼同字符的位置是徹底對應的,所以區位碼同字符之間也是一一對應的。這樣全部的字符均可經過其區位碼轉換爲數字編碼信息
GBK編碼中,每一個字節的第一個二進制位會被當作標誌位,標誌位爲1則表示是中文字符,標誌位爲0則表示爲英文字符orm
爲了使計算機支持更多的語言,Windows(也多是美國別的某機構)制定了一種編碼格式——ANSI編碼格式(又稱MBCS:Muilti-Bytes Charecter Set,多字節字符集),這個ANSI編碼收錄了中國製定的GBK編碼,因此在計算機上裝的「簡體中文Windows系統」中使用的ANSI編碼格式就是GBK編碼,而在日本裝的日文Windows系統中使用的ANSI編碼格式就是Shift_JIS編碼blog
雖然各國都有本身的字符編碼,可是卻沒法在計算機上互通,由於在制定編碼的時候,都有各自的編碼規則,有可能兩個國家使用了相同的二進制組合卻表明的是各自國家語言的不一樣字符。爲何有時候電子郵件和網頁都常常會出現亂碼,就是由於信息的提供者多是日文的ANSI編碼體系,而信息的讀取者多是中文的編碼體系,他們對同一個二進制編碼值進行顯示,採用了不一樣的編碼,致使亂碼。這個問題促使了unicode碼的誕生遊戲
Unicode是一個很大的字符編碼規則,它收錄了中文、英文、日文還有別的各類國家的語言的編碼表。Unicode是一個龐大的集合,如今的規模能夠容納100多萬個符號。每一個符號的編碼都不同,好比:U+0041表示英語的大寫字母A,「漢」這個字的Unicode編碼是U+6C49
在咱們編寫代碼時,能夠在賦值的時候利用「U+ 」的方法,好比在pycharm中圖片
x = u'你是我のgirl friend' ##這個「x」是Unicode格式的數據,不管怎麼打印,都不會亂碼
Unicode當然統一了編碼方式,可是它的效率不高,好比UCS-4(Unicode的標準之一)規定用4個字節存儲一個符號,那麼每一個英文字母前都必然有三個字節是0,這對存儲和傳輸來講都很耗資源。而不這樣規定的話,有的字符是一個字節,有的字符是兩個字節組合,計算機在讀取的時候就不知道按照那種規則讀取內容了,就會形成亂碼,因此Unicode雖然結決了這種問題,可是若是存儲的話可能會對內存形成很大的浪費並且讀取的速度也會比較慢,這樣就須要一種存儲規則,將寫好的Unicode編碼轉換成佔內存較小的編碼格式,解決讀寫問題內存
utf-8是一種編碼規則,是爲了更好的存儲和讀取用Unicode編寫的編碼utf-8
utf-8能夠將本來的Unicode碼進行transformation(轉換),這種轉換就是給每一個Unicode碼進行標記,使得讓計算機看到某個標記就知道待會要讀取幾個字節的代碼
編碼規則 | 二進制代碼 |
---|---|
GBK | 1001 0110 1000 0001 |
Unicode/UCS-4 | 0000 0000 0000 0000 xxxx xxxx xxxx xxxx |
UTF-8 | 1101 0110 1000 0001 |