python2編碼詳解、一

之前使用python3沒覺的什麼,跟着公司使用python2後被編碼問題折磨的痛不欲生,好好研究了一下編碼問題,參考了不少博文,加入本身的理解,這裏只是對編碼的介紹,下一篇是python2中編碼問題的詳解!python

關於編碼介紹:windows

衆所周知,計算機內部只有0和1,只能夠存儲和處理二進制數據,所以任何字符也是由01串組成,從文字或符號到計算機能夠識別的二進制數之間須要一個映射關係,這個惟一的映射關係也稱爲字符編碼(character encoding)就是字集碼。
	再具體的說對於「編碼」有兩個含義:
	1、字符到存儲或者存儲轉爲字符的處理過程,是一個動詞,包括兩個過程,首先從映射表中找到對應的二進制編碼,而後把這個二進制編碼按照存儲規則存儲。
	2、「映射關係、存儲規則」,是一個名詞,包含兩部分,1.是字符到二進制的映射關係(一般理解),2.是二進制的存儲規則。
		例子(虛構)
			映射關係:字符「我」->00001111。
			存儲規則:00001111能夠存爲00001111,也可存爲1111,簡單理解爲長度不一樣。
	爲了運算方便,規定8個bit組成一個字節(Byte),字符表達的最小單位就是字節,即一個字符佔用一個或者多個字節。

最初的ASCII編碼瀏覽器

計算機發源於美國,使用的是英文字母(字符),全部26個字母的大小寫加上數字0到10,加上符號和控制字符,用一個字節(8個bit)就能表示全部的字符,這就是ANSI的「Ascii」編碼(American Standard Code for Information)。標準 ASCII 碼使用 7 個二進位對字符進行編碼,對應的 ISO 標準爲 ISO646 標準。但因爲計算機基本處理單位爲字節( 1byte = 8bit ),因此通常仍以一個字節來存放一個 ASCII 字符。每個字節中多餘出來的一位(最高位)在計算機內部一般保持爲 0 (在數據傳輸時可用做奇偶校驗位)。後來又劃分爲兩個集合:128個字符的標準ASCII碼和附加的128個字符的擴充和ASCII碼。基本的 ASCII 字符集共有 128 個字符,其中有 96 個可打印字符,包括經常使用的字母、數字、標點符號等,另外還有 32 個控制字符。目前使用最普遍的西文字符集及編碼也是 ASCII 字符集和 ASCII 碼( ASCII 是 American Standard Code for Information Interchange 的縮寫),它同時也被國際標準化組織( International Organization for Standardization, ISO )批准爲國際標準。

各個地區各自編碼工具

當計算機普遍推廣到各個地區國家時發現各個地區國家都有各自的的符號和文字,ASCII編碼不能將這些符號映射到計算機內部處理,因而各個國家又制定了本身的標準字符集編碼,好比中國漢字這麼多,一個字節表示不下,因而有了GB2312(中國國家標準簡體中文字符集)。GB2312使用兩個字節來對一個字符進行編碼,其中前面的一個字節(稱之爲高字節)從0xA1用到 0xF7,後面一個字節(低字節)從0xA1到0xFE,GB2312能表示幾千個漢字,並且與asill碼也是兼容的。其餘國家和地區還有拉丁什麼編碼基本用不到。(後面複製了關於GBK,GB2312的材料)

ANSI編碼ui

上面那些使用 多 個字節來表明各類各個國家地區文字符號延伸編碼方式,統稱爲 ANSI 編碼,又稱爲"MBCS(Muilti-Bytes Charecter Set,多字節字符集)"。在簡體中文系統下,ANSI 編碼表明 GB2312 編碼,在日文操做系統下,ANSI 編碼表明 JIS 編碼,因此在中文 windows下要轉碼成gb2312,gbk只須要把文本保存爲ANSI 編碼便可。 不一樣 ANSI 編碼之間互不兼容,當信息在國際間交流時,沒法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。

unicode編碼編碼

當各個國家都有本身的編碼,甚至還不止一套時,暴露出一個很大的缺點是,同一個編碼值在不一樣的編碼體系裏表明着不一樣的字。這樣一塊兒使用時就容易形成混亂,分開使用又很差互相通訊兼容。最終致使了unicode碼(萬國碼)的誕生。其中每一個語言下的ANSI編碼,都有一套一對一的編碼轉換器,Unicode變成全部編碼轉換的中間介質。全部的編碼都有一個轉換器能夠轉換到Unicode,而Unicode也能夠轉換到其餘全部的編碼。這種編碼,將世界上全部的符號都歸入其中,不管是英文、日文、仍是中文等,你們都使用這個編碼表,就不會出現編碼不匹配現象。每一個符號對應一個惟一的編碼,亂碼問題就不存在了。Unicode固然是一個很大的集合,採用32位二進制(4字節)表示一個字符,這樣即可以一套編碼對應多種不一樣語言。如今的規模能夠容納100多萬個符號。每一個符號的編碼都不同,好比,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,「漢」這個字的Unicode編碼是U+6C49。
	Unicode是一個以’U+’字符開頭,後面跟着4位或者5位或者6位十六進制數字,那麼接下來的問題就是如何把Unicode碼點映射到二進制字節上,經常使用的碼點映射方式有UTF-1六、UTF-32,UTF-8。單字節的ASCII碼字符仍然映射的是單字節,並且ASCII編碼方式是UTF-8的子集。

UTF-八、UTF-16等操作系統

Unicode當然統一了編碼方式,可是它的效率不高,好比UCS-4(Unicode的標準之一)規定用4個字節存儲一個符號,那麼每一個英文字母前都必然有三個字節是0,這對存儲和傳輸來講都很耗資源。爲了提升Unicode的編碼效率,因而就出現了UTF系列編碼。UTF-32中,每一個字符固定佔4字節,按照Unicode編碼徹底映射。UTF-8和UTF-16則屬於變長編碼,分別使用最少1個(UTF-8)或2個(UTF-16)字節到最多4個字節來編碼。UTF-8最大的一個特色,就是它是一種變長的編碼方式,能夠根據不一樣的符號自動選擇編碼的長短。好比英文字母能夠只用1個字節就夠了。
	UTF-8的編碼規則很簡單,只有二條:
	1)對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的unicode碼。所以對於英語字母,UTF-8編碼和ASCII碼是相同的。
	2)對於n字節的符號(n>1),第一個字節的前n位都設爲1,第n+1位設爲0,後面字節的前兩位一概設爲10。剩下的沒有說起的二進制位,所有爲這個符號的unicode碼。

衆編碼之間的關係(重點):翻譯

以前出現的編碼,如ASCII編碼,gbk編碼,gb2312編碼都包含兩部分,既映射關係(規則/名稱)與映射方式(動詞),映射關係可理解是一個字符對應的二進制映射表,映射方式是將字符映射到對應的二進制數後怎麼存儲的問題,這些編碼(如ASCII編碼,gbk編碼,gb2312編碼)既有本身的映射表,又有本身的映射方式(專有名稱爲編碼器)。
	而unicode只是一個編碼規範,是全部字符對應二進制的集合(名稱,簡單理解爲映射表),而沒有具體的編碼存儲規則。或者說,unicode是表現形式,而不是存儲形式,就是說沒用定義每一個字符是如何以二進制的形式存儲的。這個就跟ASCII編碼,gbk編碼,gb2312編碼這些不同,這些編碼的表現形式即存儲形式。unicode的二進制形式是與終端的編碼格式無關的,由於它只是一個固定的映射關係。
	UTF-八、UTF-1六、UTF-32就是unicode的存儲形式。好比什麼樣的二進制數用幾個字節存儲。

總結:設計

ASCII編碼只能映射少數256個西文字符,是一個通用國際標準,包括從映射到存儲。
	GBK編碼,GB2312編碼,latin編碼...是各個地區本身制定的映射,包括從映射到存儲。
	unicode編碼,是一個全球通用的映射關係,能夠將任何字符映射到惟一的二進制編碼上。
	UTF-8/UTF-16編碼,是unicode編碼下的存儲方式,使用的映射關係就是unicode編碼關係。

擴展材料:code

GB2312 也是ANSI編碼裏的一種,對ANSI編碼最初始的ASCII編碼進行擴充,爲了知足國內在計算機中使用漢字的須要,中國國家標準總局發佈了一系列的漢字字符集國家標準編碼,統稱爲GB碼,或國標碼。其中最有影響的是於1980年發佈的《信息交換用漢字編碼字符集 基本集》,標準號爲GB 2312-1980,因其使用很是廣泛,也常被通稱爲國標碼。GB2312編碼通行於我國內地;新加坡等地也採用此編碼。幾乎全部的中文系統和國際化的軟件都支持GB 2312。由6763個經常使用漢字和682個全角的非漢字字符組成。其中漢字根據使用的頻率分爲兩級。一級漢字3755個,二級漢字3008個。因爲字符數量比較大,GB2312採用了二維矩陣編碼法對全部字符進行編碼。首先構造一個94行94列的方陣,對每一行稱爲一個「區」,每一列稱爲一個「位」,而後將全部字符依照下表的規律填寫到方陣中。這樣全部的字符在方陣中都有一個惟一的位置,這個位置能夠用區號、位號合成表示,稱爲字符的區位碼。如第一個漢字「啊」出如今第16區的第1位上,其區位碼爲1601。由於區位碼同字符的位置是徹底對應的,所以區位碼同字符之間也是一一對應的。這樣全部的字符均可經過其區位碼轉換爲數字編碼信息。GB2312編碼用兩個字節(8位2進制)表示一個漢字,因此理論上最多能夠表示256×256=65536個漢字。但這種編碼方式也僅僅在中國行得通,若是您的網頁使用的GB2312編碼,那麼不少外國人在瀏覽你的網頁時就可能沒法正常顯示,由於其瀏覽器不支持GB2312編碼。固然,中國人在瀏覽外國網頁(好比日文)時,也會出現亂碼或沒法打開的狀況,由於咱們的瀏覽器沒有安裝日文的編碼表。
	GB2312的出現,基本知足了漢字的計算機處理須要,但對於人名、古漢語等方面出現的罕用字,GB 2312不能處理,這致使了後來GBK及GB 18030漢字字符集的出現。GBK即漢字內碼擴展規範,K爲擴展的漢語拼音中「擴」字的聲母。英文全稱Chinese Internal Code Specification。GBK同Gb2312同樣,兩個字節表示一個字符,但區別在於,放寬了對低字節的要求,所以能表示的範圍擴大到了20000多。後來,爲了容納少數名族,以及其餘漢字國家的文字,出現了GB13080。GB13080是兼容GBK與GB2312的,能容納更多的字符,與GBK與GB2312不一樣的是,GB18030採用單字節、雙字節和四字節三種方式對字符編碼。GBK採用雙字節表示,整體編碼範圍爲8140-FEFE,首字節在81-FE 之間,尾字節在40-FE 之間,剔除 xx7F一條線。總計23940 個碼位,共收入21886個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號883 個。P-Windows3.2和蘋果OS以GB2312爲基本漢字編碼, Windows 95/98則以GBK爲基本漢字編碼。有些漢字用五筆和拼音都打不出來,如:溙(五筆IDWI),須調出GBK字符集才能打出這個字。極品五筆中可右擊輸入法圖標,設置,屬性中選GBK字符集。極點五筆中可點擊工具條中相關圖標進行轉換。GBK編碼標準兼容GB2312,共收錄漢字21003個、符號883個,並提供1894個造字碼位,簡、繁體字融於一庫。GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集——基本集》,1980年由國家標準總局發佈。基本集共收入漢字6763個和非漢字圖形字符682個,通行於中國大陸。新加坡等地也使用此編碼。GBK是對GB2312-80的擴展,也就是CP936字碼表 (Code Page 936)的擴展(以前CP936和GB 2312-80如出一轍)。
	在臺灣、香港與澳門地區,使用的是繁體中文字符集。而1980年發佈的GB2312面向簡體中文字符集,並不支持繁體漢字。在這些使用繁體中文字符集的地區,一度出現過不少不一樣廠商提出的字符集編碼,這些編碼彼此互不兼容,形成了信息交流的困難。爲統一繁體字符集編碼,1984年,臺灣五大廠商宏碁、神通、佳佳、零壹以及大衆一同制定了一種繁體中文編碼方案,因其來源被稱爲五大碼,英文寫做Big5,後來按英文翻譯回漢字後,廣泛被稱爲大五碼。大五碼是一種繁體中文漢字字符集,其中繁體漢字13053個,808個標點符號、希臘字母及特殊符號。大五碼的編碼碼錶直接針對存儲而設計,每一個字符統一使用兩個字節存儲表示。第1字節範圍81H-FEH,避開了同ASCII碼的衝突,第2字節範圍是40H-7EH和A1H-FEH。由於Big5的字符編碼範圍同GB2312字符的存儲碼範圍存在衝突,因此在同一正文不能對兩種字符集的字符同時支持。
	就漢字而言,三種編碼方式的表示範圍是:
	GB18030 > GBK > GB2312
	即GBK是GB2312的超集,GB1803又是GBK的超集。一個漢字能夠用GBK表示,但不必定能被GB2312所表示。
相關文章
相關標籤/搜索