Python字串編碼格式有哪些

2020-07-16 10:05:24
世界上存在多種自然語言,這意味著 Python 程式程式碼中可能存在若干種語言文字的識別符號和字串用於顯示、輸出或注釋。為了儲存和顯示這些不同的語言文字,不同的國家和組織制定了若干種字元集標準。常見的字元集有 ASCII 字元集、簡體中文 GB2312 字元集、繁體中文 Big5 字元集、簡體中文 GB18030 字元集、Unicode 字元集等。

ASCII字元集

ASCII(American Standard Code for Information Interchange,美國資訊交換標準程式碼)是由美國國家標準學會(American National Standard Institute,ANSI)制定的基於拉丁字母的一套電腦編碼系統,起始於 20 世紀 50 年代後期,在 1967 年定案,主要用於顯示現代英語和其他西歐語言。ASCII 字元集是現今最通用的單位元組編碼系統,等同於國際標準 ISO/IEC 646。

ASCII 碼使用指定的 7 位或 8 位二進位制陣列合來表示 128 或 256 種可能的字元。標準 ASCII 碼也叫基礎 ASCII 碼,使用 7 位二進位制數(剩下的 1 位二進位制為 0)來表示所有的大寫和小寫字母、數位 0 到 9、標點符號,以及在美式英語中使用的特殊控制字元。其中:

1) 0~31 及 127(共 33 個)是控制字元或通訊專用字元(其餘為可顯示字元),如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BS (退格)、BEL(響鈴)等;通訊專用字元:SOH(文頭)、EOT(文尾)、ACK(確認)等;ASCII 值為 8、9、10 和 13 分別轉換為退格、製表、換行和回車字元。它們並沒有特定的圖形顯示,但會依據不同的應用程式,而對文字顯示有不同的影響。

2) 32~126(共 95 個)是字元(32 是空格),其中 48~57 為 0 到 9 十個阿拉伯數位。

3) 65~90 為 26 個大寫英文字母,97~122 為 26 個小寫英文字母,其餘為一些標點符號、運算子號等。

4) 在標準 ASCII 碼中,最高位(b7)用作奇偶校驗位。奇偶校驗,是指在程式碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。奇校驗規定:正確的程式碼一個位元組中1的個數必須是奇數,若非奇數,則在最高位(b7)加 1;偶校驗規定:正確的程式碼一個位元組中 1 的個數必須是偶數,若非偶數,則在最高位(b7)加 1。

5) 在標準 ASCII 碼中,最高位(b7)用作奇偶校驗位。奇偶校驗,是指在程式碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。奇校驗規定:正確的程式碼一個位元組中1的個數必須是奇數,若非奇數,則在最高位(b7)加 1;偶校驗規定:正確的程式碼一個位元組中1的個數必須是偶數,若非偶數,則在最高位(b7)加 1。

6) 後 128 個稱為擴充套件 ASCII 碼。許多基於 x86 的系統都支援使用擴充套件(或“高”)ASCII。擴充套件 ASCII 碼允許將每個字元的第 8 位用於確定附加的 128 個特殊符號字元、外來語字母和圖形符號。

需要注意的是,數位的 ASCII 碼<大寫字母的 ASCII 碼<小寫字母的 ASCII 碼。

GB2312和GB18030字元集

GB2312 和 GB18030 字元集是由中國制定的漢字編碼字元集,GB 代表國標,2312 和 18030 分別表示標準編號。

GB2312 的中文名稱是《資訊交換用漢字編碼字元集》,它是由中國國家標準總局在 1980 年發布並於 1981 年 5 月 1 日開始實施的一套國家標準,標準號是 GB2312—1980。GB2312 編碼適用於漢字處理、漢字通訊等系統之間的資訊交換,通行於中國大陸,中國大陸幾乎所有的中文系統和國際化的軟體都支援 GB2312。

GB2312 基本集共收入漢字 6763 個(其中一級漢字 3755 個,二級漢字 3008 個),非漢字圖形字元 682 個。整個 GB2312 字元集分成 94 個區,每區有 94 個位,每個區位上只有一個字元,因此可用所在的區和位來對漢字進行編碼,稱為區位碼。把換算成十六進位制的區位碼加上 2020H,就得到國標碼,把國標碼加上 8080H,就得到了常用的計算機機內碼。

1995 年中國國家標準總局又頒布了《漢字編碼擴充套件規範》(GBK)。GBK 與 GB2312—1980 國家標準所對應的內碼標準相容,同時在字彙一級支援 ISO/IEC10646—1 和 GB13000—1 的全部中、日、韓(CJK)漢字,共計 20902 個字。

GB18030 的中文名稱是《資訊科技中文編碼字元集》,是我國繼 GB2312—1980和GB13000.1—1993 之後最重要的漢字編碼標準,是我國計算機系統必須遵循的基礎性標準之一。GB18030 有兩個版本:GB18030—2000 和 GB18030—2005。GB18030—2000 是 GBK 的取代版本,它的主要特點是在 GBK 基礎上增加了 CJK 統一漢字擴充 A 的漢字。GB18030—2005 的主要特點是在 GB18030—2000 基礎上增加了 CJK 統一漢字擴充 B 的漢字。

Big5字元集

Big5 碼,又稱為大五碼,是繁體中文社群中最常用的電腦漢字字元集標準,共收錄 13060 個漢字。倚天中文系統、Windows 繁體中文版等主要系統的字元集都是以Big5為基準的,但廠商又各自增加了不同的造字與造字區,派生出多種不同版本。2003 年,Big5 被收錄到 CNS11643 中文標準交換碼的附錄當中,獲取了較正式的地位,這個最新版本稱為 Big5—2003。

Big5 碼,又稱為大五碼,是繁體中文社群中最常用的電腦漢字字元集標準,共收錄 13060 個漢字。倚天中文系統、Windows 繁體中文版等主要系統的字元集都是以 Big5 為基準的,但廠商又各自增加了不同的造字與造字區,派生出多種不同版本。2003 年,Big5 被收錄到 CNS11643 中文標準交換碼的附錄當中,獲取了較正式的地位,這個最新版本稱為 Big5—2003。

Big5 碼是一套雙位元組字元集,使用了雙八碼儲存方法,以兩個位元組來存放一個字。第一個位元組稱為“高位位元組”,第二個位元組稱為“低位位元組”。“高位位元組”使用了 0x81-0xFE,“低位位元組”使用了 0x40-0x7E 及 0xA1-0xFE。

因為低位元字元包含了程式語言中字串或命令常會用到的特殊字元,例如 0x5C“”、0x7C“|”等。“”在許多用途的字串中當作跳脫符號(跳脫字元),例如 n(換行)、r(歸位)、t(tab)、(本身符號)、"(引號)等。而“|”在 UNIX 作業系統中大多當作命令管線使用,如“ls-la|more”等。如果在字串中有這些特殊的跳脫字元,那麼它們會被程式或直譯器解釋為特殊用途。但是因為是中文,故無法正確解釋為上面所述的行為,因此程式可能會忽略此跳脫符號或是中斷執行。

Unicode字元集

Unicode 是電腦科學領域裡的一項業界標準,包括字元集、編碼方案等。Unicode 是為了解決傳統的字元編碼方案的局限而產生的,它為每種語言中的每個字元設定了統一且唯一的二進位制編碼,以滿足跨語言、跨平台進行文字轉換、處理的要求。Unicode 於 1990 年開始研發,在 1994 年正式發布。

Unicode 通常用兩個位元組表示一個字元,原有的英文編碼從單位元組變成雙位元組,只需要把高位元組全部填為 0 即可。因為 Python 的誕生比 Unicode 標準發布的時間還要早,所以最早的 Python 只支援 ASCII 編碼,普通的字串 ABC 在 Python 內部都是使用 ASCII 編碼的。

在表示一個 Unicode 的字元時,通常會用“U+”然後緊接著一組十六進位制的數位來表示這一個字元。在基本多文種平面(英文為 Basic Multilingual Plane,簡寫為 BMP,它又簡稱為零號平面,plane 0)裡的所有字元,要用四位十六進位制數(例如 U+4AE0,共支援六萬多個字元),在零號平面以外的字元則需要使用五位或六位十六進位制數了。舊版的 Unicode 標準使用相近的標記方法,但卻有些差異:在 Unicode 3.0 中使用“U-”然後緊接著八位數,而“U+”則必須隨後緊接著四位數。

在 Unicode 中有很多方式將數位 23383 表示成程式中的資料,包括 UTF-8、UTF-16、UTF-32。UTF 是 Unicode Transformation Format 的縮寫,可以翻譯成 Unicode 字元集轉換格式,即怎樣將 Unicode 定義的數位轉換成程式資料。

例如,“漢字”對應的數位是 0x6c49 和 0x5b57,而編碼的程式資料是:

Char  data_utf8[]={0xE6f, 0xB2, 0x94, 0xE5, OxAD, 0x97 };   //UTF-8 編碼
char16_t  data_utf16[]={0x6C49, 0x5B57};   //UTF-16編碼
char32_t data_utf32[]={0x00006C49,0x00005B57};  //UTF-32編碼


這裡用 char、char16_t、char32_t 分別表示無符號 8 位整數,無符號 16 位整數和無符號 32 位整數。UTF-8、UTF-16、UTF-32 分別以 char、char16_t、char32_t 作為編碼單位。根據位元組序的不同,UTF-16 可以被實現為 UTF-16LE 或 UTF-16BE,UTF-32 可以被實現為 UTF-32LE 或 UTF-32BE。