字元編碼學習筆記
"表示換行,"
"表示回車,因為這些字元的ASCII碼不能直接放入字元串中因此需要用逃逸字元來表示,當編譯器碰到
時會自動翻譯成ASCII的0xa, 0xd. +【EUC】全名為Extended Unix Code,是一個使用8位編碼來表示字元的方法。 -它使用了一些兼容於ISO/IEC 2022區位碼的94x94編碼表,把每個區位加上0xA0來表示,以便兼容於ASCII。它主要用於表示及儲存漢語文字、日語文字及朝鮮文字。 +EUC-CN是GB 2312最常用的表示方法。瀏覽器編碼表上的「GB2312」,通常都是指「EUC-CN」表示法。 -EUC-CN可以理解為 GB2312的別名,和GB2312完全相同。 +【GB 2312】是中國國家標準簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》 http://zh.wikipedia.org/zh-cn/GB_2312 -由中國國家標準總局發布,1981年5 月1日實施。 -GB 2312標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個 -同時收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內的682個字元。 -GB2312的編碼範圍是0xA1A1-0x7E7E,去掉未定義的區域之後可以理解為實際編碼範圍是0xA1A1-0xF7FE。 -GB 2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。 +GB 2312中對所收漢字進行了「分區」處理,每區含有94個漢字/符號。這種表示方式也稱為區位碼。 -01-09區為特殊符號。 -16-55區為一級漢字,按拼音排序。 -56-87區為二級漢字,按部首/筆畫排序。 -10-15區及88-94區則未有編碼。 -舉例來說,「啊」字是GB2312之中的第一個漢字,它的區位碼就是1601。 +區位碼與內碼的對應關係 -一個漢字的內碼佔兩個位元組,分別稱為高位位元組與低位位元組。 -這兩位位元組與區位碼的關係如下: 內碼高位=區碼+A0H(H表示十六進位) 內碼低位=位碼+A0H。 +例如,漢字」啊」的區位碼為」1601″用十六進位表示即為」1001H」,則它的內碼為」B0A1H」。 -其中B0H為內碼的高位位元組,A1H為內碼的低位位元組。 -GB2312區域碼全表: http://www.mytju.com/classCode/tools/QuWeiMa_FullList.asp -對於人名、古漢語等方面出現的罕用字,GB 2312不能處理,這導致了後來GBK及GB 18030漢字字符集的出現。 +【GBK】全名為漢字內碼擴展規範,英文名Chinese Internal Code Specification。K 即是「擴展」所對應的漢語拼音(KuoZhan11)中「擴」字的聲母。GBK 來自中國國家標準代碼GB 13000.1-93。 -GBK編碼是 GB2312編碼的超集,向下完全兼容GB2312,同時GBK收錄了Unicode基本多文種平面中的所有CJK漢字。 -GBK還收錄了 GB2312不包含的 漢字部首符號、豎排標點符號等字元。 -GBK的整體編碼範圍是為0x8140-0xFEFE,不包括低位元組是0×7F的組合。 -高位元組範圍是0×81-0xFE,低位元組範圍是0x40-7E和0x80-0xFE。 -範圍 第1位元組 第2位元組 編碼數 字數 水準 GBK/1 A1–A9 A1–FE 846 717 水準 GBK/2 B0–F7 A1–FE 6,768 6,763 水準 GBK/3 81–A0 40–FE (7F除外) 6,080 6,080 水準 GBK/4 AA–FE 40–A0 (7F除外) 8,160 8,160 水準 GBK/5 A8–A9 40–A0 (7F除外) 192 166 用戶定義 AA–AF A1–FE 564 用戶定義 F8–FE A1–FE 658 用戶定義 A1–A7 40–A0 (7F除外) 672 合計: 23,940 21,886 -上述GBK/1和GBK/2的領域即GB 2312-80用通常方法編碼的區域。 +低位元組是 0x40-0x7E的GBK字元有一定特殊性,因為這些字元佔用了ASCII碼的位置,與ASCII不兼容,這樣會給一些系統帶來麻煩。 -CP936和GBK的有些許差別,絕大多數情況下可以把CP936當作GBK的別名。 +【GB18030】全稱:國家標準GB 18030-2005《信息技術 中文編碼字符集》,是中華人民共和國現時最新的內碼字集. -與GB 2312-1980完全兼容,與GBK基本兼容,支持GB 13000及Unicode的全部統一漢字,共收錄漢字70244個。 -與 UTF-8 相同,採用多位元組編碼,每個字可以由1個、2個或4個位元組組成。 -支持中國國內少數民族的文字,不需要動用造字區。 -漢字收錄範圍包含繁體漢字以及日韓漢字 +【Big5】,又稱為大五碼或五大碼,是使用繁體中文(正體中文)社區中最常用的計算機漢字字符集標準,共收錄13,060個漢字。 -Big5是雙位元組編碼,高位元組編碼範圍是0x81-0xFE,低位元組編碼範圍是0x40-0x7E和0xA1-0xFE。 -和GBK相比,少了低位元組是0x80-0xA0的組合。0x8140-0xA0FE是保留區域,用於用戶造字區。 -Big5收錄的漢字只包括繁體漢字,不包括簡體漢字,一些生僻的漢字也沒有收錄。GBK收錄的日文假名字元、俄文字元Big5也沒有收錄。 -因為Big5當中收錄的字元有限,因此有很多在Big5基礎上擴展的編碼,如倚天中文系統。 -Windows系統上使用的代碼頁CP950也可以理解為是對Big5的擴展,在Big5的基礎上增加了7個漢字和一些符號。 -因為Big5也佔用了 ASCII的編碼空間(低位元組所使用的0x40-0x7E),所以Big5編碼在一些環境下存在和GBK編碼相同的問題 +【UCS】通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的字元編碼方式,採用4位元組編碼。 -Unicode組織和ISO組織都試圖定義一個超大字符集,目的是要涵蓋所有語言使用的字元以及其他學科使用的一些特殊符號,這個字符集就是通用字符集(UCS,Universal Character Set)。 -這兩個組織經過協調,雖然在各自發展,但定義的字元位置是完全一致的。 -ISO 10646標準定義了一個31位的字符集。前兩個位元組的位置(0x0000-0xFFFD)被稱為基本多語言面(Basic Multilingual Plane, BMP) ,超出兩個位元組的範圍稱作輔助語言面。 -BMP基本包括了所有語言中絕大多數字元,所以只要支持BMP就可以支持絕大多數場合下的應用。Unicode 3.0對應的字符集在BMP範圍內。 -UCS字符集為每個字元分配了一個位置,通常用「U」再加上某個字元在UCS中位置的16進位數作為這個字元的UCS表示,例如「U+0041」表示字元「A」。 -UCS字元 U+0000到U+00FF與ISO-8859-1完全一致。 +【UCS-2】、【UTF-16】是UCS字符集(或者說是Unicode字符集)實際應用中的具體編碼方式。 +UCS-2是兩個位元組的等寬編碼,因為只是使用了兩個位元組的編碼空間,所以只能對BMP中的字元做編碼。 -UCS-2 不同於GBK和Big5,它是真正的等寬編碼,每個字元都使用兩個位元組,這個特性在字元串截斷和字元數計算時非常方便。 +UTF-16是變長編碼,用兩個位元組對BMP內的字元編碼,用4個位元組對超出BMP範圍的輔助平面內的字元作編碼。 -UTF-16是UCS- 2的超集,UTF-16編碼的兩位元組編碼方式完全和UCS-2相同。 +UCS-2和UTF- 16在存儲和傳輸時會使用兩種不同的位元組序,分別是big endian和little endian(大尾和小尾)。UCS-2BE的別名。 -例如「啊」(U+554A)用big endian表示就是0x554A,用little endian表示就是0x4A55。UCS-2和UTF-16默認的位元組序是big endian方式。 -在傳輸過程中為了說明位元組序需要在位元組流前加上BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。 -UCS-2BE、UCS-2LE是實際應用中使用的編碼名稱,對應著big endian和little endian,UTF-16BE、UTF-16LE也是如此。 -因為默認是 BE位元組序,所以可以把UCS-2當做是UCS-2BE的別名。 +【UTF-8】是UCS字符集的另一種編碼方式 -TF-16的每個單元是兩個位元組(16位),而UTF-8的每個單元是一個位元組(8位)。 -UTF-16中用一個或兩個雙位元組表示一個字元,UTF-8中用一個或幾個單位元組表示一個字元。 -可以認為UTF-8編碼是根據一定規律從UCS-2轉換得到的。 +從UCS-2到UTF- 8之間有以下轉換關係: +UCS-2 UTF-8 U+0000 - U+007F 0xxxxxxx U+0080 - U+07FF 110xxxxx 10xxxxxx U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx -例如「啊」字的UCS- 2編碼是0x554A,對應的二進位是0101 0101 0100 1010,轉成UTF-8編碼之後的二進位是 1110 0101 10 010101 10 001010,對應的十六進位是0xE5958A。 +根據UTF-8的生成規律和UCS字符集的特性,可以看到UTF-8具有的特性: -UTF-8完全和 ASCII兼容。 -大於U+007F的 UCS字元,在UTF-8編碼中至少是兩個位元組。 -UTF-8中的每個字元編碼的首位元組總在0x00-0xFD之間。 -根據首位元組就可以判斷之後連續幾個位元組。 -GBK編碼中的漢字字元都在UCS-2中的範圍都在U+0800 - U+FFFF之間,所以每個GBK編碼中的漢字字元的UTF-8編碼都是3個位元組。 -但GBK中包含的其他字元的UTF-8編碼就不一定是3個位元組了,如GBK中的俄文字元。
推薦閱讀:
※屁牌兼容1位元組ASCII、2位元組陸港台日常用、單碼最多3位元組、全覆蓋Unicode編碼
※字元編碼(四)|python2中的編碼問題