首先先了解
什么是字符編碼?
我們知道,計算機是以二進制的形式來存儲數據的,即它只認識 0 和 1 兩個數字。 20 世紀 60 年代,是計算機發展的早期,這時美國是計算機領域的老大,它制定了一套編碼標准,解決了 128 個英文字符與二進制之間的對應關系,被稱為 ASCII 字符編碼(簡稱 ASCII 碼)。
ASCII 碼,全稱為美國信息交換標准代碼,是基於拉丁字母的一套字符編碼,主要用於顯示現代英語,因為萬維網的出現,使得 ASCII 碼廣為使用,其直到 2007 年 12 月才逐漸被 Unicode 取代。
雖然英語用 128 個字符編碼已經夠用,但計算機不僅僅用於英語,如果想表示其他語言,128 個符號顯然不夠用,所以很多其他國家都在 ASCII 的基礎上發明了很多別的編碼,例如包含了漢語簡體中文格式的 GB2312 編碼格式(使用 2 個字節表示一個漢字)。
也正是由於出現了很多種編碼格式,導致了“文件顯示亂碼”的情況。比如說,發送郵件時,如果發信人和收信人使用的編碼格式不一樣,則收信人很可能看到亂碼的郵件。基於這個原因,Unicode 字符集應運而生。
Unicode 字符集又稱萬國碼、國際碼、統一碼等。從名字就可以看出來,它是以統一符號為目標的字符集。Unicode 對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更簡單的方式來呈現和處理文字。
注意,在實際使用時,人們常常混淆字符集和字符編碼這兩個概念,我認為它們是不同的:
- 字符集定義了字符和二進制的對應關系,為每個字符分配了唯一的編號。可以將字符集理解成一個很大的表格,它列出了所有字符和二進制的對應關系,計算機顯示文字或者存儲文字,就是一個查表的過程;
- 而字符編碼規定了如何將字符的編號存儲到計算機中,要知道,有些字符編碼(如 GB2312 和 GBK)規定,不同字符在存儲時所占用的字節數是不一樣的,因此為了區分一個字符到底使用了幾個字節,就不能將字符的編號直接存儲到計算機中,字符編號在存儲之前必須要經過轉換,在讀取時還要再逆向轉換一次,這套轉換方案就叫做字符編碼。
Unicode 字符集可以使用的編碼方案有三種,分別是:
- UTF-8:一種變長的編碼方案,使用 1~6 個字節來存儲;
- UTF-32:一種固定長度的編碼方案,不管字符編號大小,始終使用 4 個字節來存儲;
- UTF-16:介於 UTF-8 和 UTF-32 之間,使用 2 個或者 4 個字節來存儲,長度既固定又可變。
其中,UTF-8 是目前使用最廣的一種 Unicode字符集的實現方式,可以說它幾乎已經一統江湖了。
那python中使用的那種字符編碼?
python3中使用的Unicode編碼,可以查看當前環境使用的編碼格式
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
python3 中提供了 ord,chr函數,實現字符和編碼數字之間的轉換
>>> ord('往')
24448
>>> chr(35695)
'譯'