什麼是字符編碼
計算機裡面是由各種電子電路組成的,它是如何識別我們的寫的字符的,比如hello ,你,我。
直接識別是不可能,它只能識別 二進位的0,1字符。所有我們輸入進去的字符,最終都會被轉化成0,1這種組合在一起的一串數字。
計算機存儲信息的最小單位,稱之為位(bit),又叫比特,二進位的一個「0」或一個「1」叫一位。
8個二進位位組成1個字節(Byte),1024位元組(Byte)也就是1KB,1024KB是1M,這就是我們平常說的文件大小的單位(M),比如這個圖片大小5M。
既然計算機是通過二進位的數字來識別不同字符的,那不同的字符該用多少個1和0,又該以什麼樣的順序來排列呢?
為什麼要字符編碼
這裡為了規範,就出現了ASCII編碼。ASCII ((American Standard Code for Information Interchange): 美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。
這裡的編碼規定了,每個字符由幾個0和1組成,順序也定下了。裡面包含了控制字符或通信專用字符,阿拉伯數字,大小寫英文字符,標點運算符號等,一共128個。
32~126(共95個)是字符(32是空格),其中48~57為0到9十個阿拉伯數字。65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其餘為一些標點符號、運算符號等。
了解進位數
進位也就是進位計數制,是人為定義的帶進位的計數方法。對於任何一種進位---X進位,就表示每一位置上的數運算時都是逢X進一位。 十進位是逢十進一,十六進位是逢十六進一,二進位就是逢二進一,以此類推,x進位就是逢x進位。
下面就來通過python中自帶的函數一起來驗證一下。
理解:
ord() 函數:以一個字符串作為參數,返回對應的 ASCII 數值。
chr()函數:用一個整數作參數,返回一個對應的字符。可以二進位,十進位,十六進位。
不理解進位數的可以自己去學習一下,或者利用python自帶的進位轉換函數去試一下。
0b 開頭表示二進位,0o表示八進位,0x表示十六進位,通過內置進位函數可以想互進行轉換。
Hello這樣的一個詞語要被計算機認識,只要按照ASCII編碼來就可以了。 對應的16進位編碼是:48 65 6C 6C 6F
編碼的種類
百科知識:
在英語中,用128個符號編碼便可以表示所有,但是用來表示其他語言,128個符號是不夠的。比如,在法語中,字母上方有注音符號,它就無法用 ASCII 碼表示。於是,一些歐洲國家就決定,利用字節中閒置的最高位編入新的符號。比如,法語中的é的編碼為130(二進位10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號 [5] 。
但是,這裡又出現了新的問題。不同的國家有不同的字母,因此,哪怕它們都使用256個符號的編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (),在俄語編碼中又會代表另一個符號。但是不管怎樣,所有這些編碼方式中,0--127表示的符號是一樣的,不一樣的只是128--255的這一段 。
至於亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右。一個字節只能表示256種符號,肯定是不夠的,就必須使用多個字節表達一個符號。比如,簡體中文常見的編碼方式是 GB2312,使用兩個字節表示一個漢字,所以理論上最多可以表示 256 x 256 = 65536 個符號 。
因為ASCII不夠用了,所以需要擴展字符集。
百科知識2:
不同的國家和地區制定了不同的標準,由此產生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的編碼標準。這些使用多個字節來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文Windows作業系統中,ANSI 編碼代表 GBK 編碼;在繁體中文Windows作業系統中,ANSI編碼代表Big5;在日文Windows作業系統中,ANSI 編碼代表 Shift_JIS 編碼。 [1]
簡單的說,在簡體中文系統下,ANSI編碼代表GB2312編碼;在日文作業系統下,ANSI編碼代表JS編碼。 [2]
不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。ANSI編碼表示英文字符時用一個字節,表示中文用兩個或四個字節。
但是這麼多編碼,很混亂,不同 ANSI 編碼之間互不兼容,不同語言交流時會出現亂碼。為了統一所有文字的編碼,Unicode誕生了。Unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。
雖然統一了所有字符,但是在存儲和傳輸的時候,也帶來了一些缺點,如果你傳輸的都是英文字符,使用unicode編碼就會使用更多的字節,所以後面實現了utf-8編碼,可以根據字符的情況進行可變的字節表示。
在文件保存的時候,其實是可以看見有編碼選擇的,平時可能不是很關注,讀寫文件出現編碼格式錯誤,就可以從這方面來思考解決。
編碼和解碼
utf編碼讀取文件
ANSI讀取文件/gbk
utf-8 帶 bom讀取
忽略錯誤會出現亂碼
使用utf-8-sig編碼可以解決這個問題
encode:將 Unicode 字符串轉換為特定編碼格式對應的字節碼的過程
decode:將特定編碼格式的字節碼轉換為對應的 Unicode 字符串的過程
Python3 的默認編碼為 Unicode。
編碼檢測
有時候解碼格式報錯,但是我們並不知道它是什麼編碼,那該怎樣解碼?可以通過chardet這個模塊來檢測我們文件數據的一個編碼格式,結果會顯示可信度。
python和scratch生成隨機不相同的十個數
python滑鼠連點器-測試版
python圖像處理-濾鏡處理
python圖像處理-個性化頭像