字元編碼學習筆記

+計算機只能識別二進位數據。這種二進位數據稱為計算機的內碼。 -內碼指的是「將資訊編碼後,透過某種方式儲存在特定記憶裝置時,裝置內部的編碼形式」 -二進位數據格式如:1010100100101000,只有1和0。-人類使用的是字元(character),它是文字和符號的總稱,如各種漢字,英文字母,數學符號,標點符號等。對計算以而言這些東西是無法理解的。-為了讓計算機能存取字元,人類約定了字元和內碼的對應關係,這種對應關係稱為字元編碼(encoding)。-各個國家和地區使用的字元不盡相同,如英國使用的是阿拉伯字母,中國使用的是漢字,日本使用日文。這些字元都是各個國家和地區的人類自己發明的。+很多個字元的集合稱為「字符集」(Character Set),各個國家把特定的一些字元組成特定的字符集。所以世界上存在很多的字符集。如果把字符集與計算機的機器碼建立一一對應的關係,則我們稱這個字符集稱為編碼過的字符集(Coded Character Set)。因為各種字符集一般都建立了與計算機的對應關係,所以一般我們說的字符集都是指編碼過得字符集。 -需要根據字符集的數量來確定一個字元需要用幾位的機器碼來對應。如果一個字符集有8個字元,則每個字元用3位機器碼就可以表示。範圍是000-111。+常見的字符集 +【ASCII】(American Standard Code for Information Interchange,美國信息互換標準代碼)是基於拉丁字母的字符集。它主要用於顯示現代英語。 +http://yangjun1120.spaces.live.com/blog/cns!F9D66F146BA5A776!425.entry?&_c02_owner=1 -ASCII碼是7位編碼,共128個字元。編碼範圍:0x00-0x7F。其中0x00-0x20 和0x7F共33個控制字元。 -只支持ASCII碼的系統會忽略每個位元組的最高位,只認為低7位是有效位。 +http://zh.wikipedia.org/zh/ASCII -ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)是基於拉丁字母的字符集。它主要用於顯示現代英語。 -SCII第一次以規範標準的型態發表是在1967年,最後一次更新則是在1986年。 +至今為止共定義了128個字元;其中33個字元無法顯示(這是以現今作業系統為依歸,但在DOS模式下可顯示出一些諸如笑臉、撲克牌花式等8-bit符號)。 -這33個字元多數都已是陳廢的控制字元。控制字元的用途主要是用來操控已經處理過的文字。 -在33個字元之外的是95個可顯示的字元,包含用鍵盤敲下空白鍵所產生的空白字元也算1個可顯示字元(顯示為空白)。 +缺點 -ASCII的最大缺點是只能顯示26個基本拉丁字母,因此只能用於顯示現代美國英語(而且在處理英語當中的外來詞如na?ve、café、élite等等時,所有重音符號都不得不去掉,即使這樣做會違反拼寫規則)。而EASCII雖然解決了部份西歐語言的顯示問題,但對更多其他語言依然無能為力。因此現在的蘋果電腦已經拋棄ASCII而轉用Unicode。 -ASCIIC收錄了空格及94個「可印刷字元」,足以給英語使用。但是,其他使用拉丁字母的語言(主要是歐洲國家的語言),都有一定數量的附加符號字母,故可以使用ASCII及控制字元以外的區域來儲存及表示。除了使用拉丁字母的語言外,使用西里爾字母的東歐語言、希臘語、泰語、現代阿拉伯語、希伯來語等,都可以使用這個形式來儲存及表示。 -【EASCII】(Extended ASCII,延伸美國標準信息交換碼)是將ASCII碼由7位擴充為8位而成。其中最常用的就是ISO 8859 +【ISO 8859】,全稱ISO/IEC 8859,是一系列8位字符集的標準規範,現定義了15個字符集。 +【ISO 8859-1】,正式編號為ISO/IEC 8859-1:1998,又稱Latin-1或「西歐語言」,是國際標準化組織內ISO/IEC 8859的第一個8位字符集。 -此字符集支援部分於歐洲使用的語言,包括阿爾巴尼亞語、巴斯克語、布列塔尼語、加泰羅尼亞語、丹麥語、荷蘭語、法羅語、弗里西語、加利西亞語、德語、格陵蘭語、冰島語、愛爾蘭蓋爾語、義大利語、拉丁語、盧森堡語、挪威語、葡萄牙語、里托羅曼斯語、蘇格蘭蓋爾語、西班牙語及瑞典語。 -英語可用7位編碼儲存,而其他使用拉丁字母、希臘字母、西里爾字母、希伯來字母等的語文,由於只使用數十個字母,傳統上均使用8位編碼的ISO/IEC 8859標準來表示。但由於漢語、日語及朝鮮語字數眾多,無法用單一個8位字元來表達,故需要多於一個位元組來代表一個字。於是,ISO 2022就設計出來讓漢語、日語及朝鮮語可以使用數個7位編碼的字元來示。 +【ISO 2022】【區位碼】,全稱ISO/IEC 2022,由國際標準化組織(ISO)及國際電工委員會(IEC)聯合制定,是一個使用7位編碼表示漢語文字、日語文字或朝鮮文字的方法。 +ISO 2022使用「逃逸字串」(Escape sequence)。逃逸字串由1個「ESC」字元(0x1B),再由兩至三個字串組成。此標記代表它後面的字元,屬於下表字符集的文字。 -【逃逸字元】也叫轉義字元,代表了某個特定的意思,經常用在字元串的定義中,比如""就是C語言常用的逃逸字元。當我們在字元串中說明一個特別的字元時要用到,例如"
"表示換行,"
"表示回車,因為這些字元的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中的編碼問題

TAG:學習 | 字元編碼 | 筆記 | 編碼 | 字元 |