第十二篇 字符編碼

第十二篇 字符編碼

# 預備知識

因爲計算機語言是一組高低電平,高電平表明1,低電平表明0,計算機中的全部信息都是以二進制代碼的形式存在的,不管是文字、圖片、聲音,仍是影像、遊戲......python

ASCII:美國信息交換標準碼(American Standard Code for Information Interchange)

相似於摩斯電碼,爲了讓人們能看懂這些二進制代碼,美國人最早制定了一種編碼規則——ASCII碼,用於理解二進制代碼到底表明的是哪些字符,ASCII碼使用指定的7個二進制位組合,這些組合所能表示的128個整數用來表明大小寫字母、0到9的數字、控制字符、通訊專用字符、空格符、運算符號、標點符號等的編號,經過編號能夠找到一一對應的字符,ASCII碼一般會額外使用一個擴充的二進制位,雖然這個二進制位可能並不表明任何意思,可是能夠方便以一個字節的方式存儲每一個字符ui

在美國計算機裝的英文系統上的編碼表多是ASCII碼也多是EBCDIC碼,而編碼格式也必定是ASCII編碼格式,才能在輸出文本和打開文本時不出現亂碼編碼

GBK:漢字字符集國家標準編碼

ASCII碼只能知足英文在計算機上通訊的須要,爲了擴充ASCII編碼,也爲了知足其餘語言的通訊須要,各國也都制定了各自的屬於本國語言的字符編碼來方便在計算機上通訊,例如我國的GBKcode

在GBK編碼體系下,有些字符使用雙字節組合來表示,須要知道GBK編碼標準兼容GB2312,GB2312採用了二維矩陣編碼法對全部字符進行編碼,它是一個94行94列的方陣,對每一行稱爲一個「區」,每一列稱爲一個「位」,而後將全部字符依照編碼表的規律填寫到方陣中。這樣全部的字符在方陣中都有一個惟一的位置,這個位置能夠用區號、位號合成表示,稱爲字符的區位碼。如第一個漢字「啊」出如今第16區的第1位上,其區位碼爲1601。由於區位碼同字符的位置是徹底對應的,所以區位碼同字符之間也是一一對應的。這樣全部的字符均可經過其區位碼轉換爲數字編碼信息
GBK編碼中,每一個字節的第一個二進制位會被當作標誌位,標誌位爲1則表示是中文字符,標誌位爲0則表示爲英文字符orm

ANSI(American National Standards Institute,美國國家標準協會):ANSI編碼格式(又稱MBCS:Muilti-Bytes Charecter Set,多字節字符集)

爲了使計算機支持更多的語言,Windows(也多是美國別的某機構)制定了一種編碼格式——ANSI編碼格式(又稱MBCS:Muilti-Bytes Charecter Set,多字節字符集),這個ANSI編碼收錄了中國製定的GBK編碼,因此在計算機上裝的「簡體中文Windows系統」中使用的ANSI編碼格式就是GBK編碼,而在日本裝的日文Windows系統中使用的ANSI編碼格式就是Shift_JIS編碼blog

Unicode:統一的字符編碼標準

雖然各國都有本身的字符編碼,可是卻沒法在計算機上互通,由於在制定編碼的時候,都有各自的編碼規則,有可能兩個國家使用了相同的二進制組合卻表明的是各自國家語言的不一樣字符。爲何有時候電子郵件和網頁都常常會出現亂碼,就是由於信息的提供者多是日文的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 :8-bit Unicode Transformation Format(8字節Unicode轉換格式)

utf-8是一種編碼規則,是爲了更好的存儲和讀取用Unicode編寫的編碼utf-8

utf-8能夠將本來的Unicode碼進行transformation(轉換),這種轉換就是給每一個Unicode碼進行標記,使得讓計算機看到某個標記就知道待會要讀取幾個字節的代碼

  • UTF-8的編碼規則很簡單,只有二條:
  1. 對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的unicode碼。所以對於英語字母,UTF-8編碼和ASCII碼是相同的
  2. 對於n字節的符號(n>1),第一個字節的前n位都設爲1,第n+1位設爲0,後面字節的前兩位一概設爲10。剩下的沒有說起的二進制位,所有爲這個符號的unicode碼
  3. 好比漢字字符「啊」,它在GBK中的區位碼是1601,咱們能夠看它用GBK、Unicode、utf-8如何寫成
編碼規則 二進制代碼
GBK 1001 0110 1000 0001
Unicode/UCS-4 0000 0000 0000 0000 xxxx xxxx xxxx xxxx
UTF-8 1101 0110 1000 0001

# 其實ASCII、GBK、Shift_JIS這些都是字符集,將它們轉換成計算機能看懂的二進制編碼(或者計算機將二進制編碼轉換成這些字符集所對應的字符)的過程就是字符編碼的過程

# Unicode是一種編碼標準,目前計算機編寫代碼都是按照Unicode規定的格式在編寫,它收錄了ASCII和ANSI中全部的編碼表

1 保證不亂碼的前提就是,字符按照什麼標準而編碼的,就要按照什麼標準解碼,這裏的標準就是字符編碼

2 在內存中寫的全部字符都是Unicode編碼,咱們惟一能改變的就是存儲到硬盤時使用的編碼(通常是UTF-8)

  • (內存)Unicode -------> encode(編碼)--------> (硬盤)GBK
  • (硬盤)GBK -------> dncode(編碼)--------> Unicode(內存)

相關文章
相關標籤/搜索