【字符編碼系列】經常使用的幾種字符編碼(GBK,UTF-8,UTF-16)

引言

若是不知道是什麼編碼,先試試UTF-8!

寫在前面的話

本文屬於 字符編碼系列文章之一,更多請前往 字符編碼系列php

題綱

  • 基本概念
  • 歐美的編碼html

    • ASCII碼
    • ISO-8859-1編碼
  • 中文系列編碼html5

    • GB2312編碼
    • GBK編碼
    • BIG5編碼
    • GB18030編碼
    • ANSI 編碼
  • Unicode與UCS
  • Unicode標準
  • Unicode編碼的不一樣實現shell

    • UTF-8編碼
    • UTF-16編碼
    • UTF-32編碼

基本概念

關於字符編碼的簡介以及發展編年史能夠參考 【字符編碼系列】字符,字符集,字符編碼解惑編程

本文主要詳細介紹各個編碼的特色以及實現。segmentfault

歐美的編碼

ASCII碼

簡介

(American Standand Code for InformationInterchange)的縮寫windows

ASCII碼是計算機最開始支持的基於拉丁字母的編碼,一個字符用一個字節表示,只用了低7位,最高位爲0,所以總共有128個ASCII碼,範圍爲0~127。網絡

編碼範圍

0~127(總共有128個ASCII碼),詳情百度(google)ASCII碼錶編程語言

適用範圍以及存在問題

適用於現代英文和其它西歐語言google

可是因爲編碼範圍有限,因此沒法支持多種地區的語言,後來就產生了各類其它的編碼方案

特性

單字節編碼

只佔用一個字節

高位不佔用,最多爲(01111111)

ISO-8859-1編碼

簡介

即」標準碼」,一般叫作Latin-1

ISO-8859-1編碼是單字節編碼,向下兼容ASCII,其編碼範圍是0x00-0xFF,0x00-0x7F之間徹底和ASCII一致,0x80-0x9F之間是控制字符,0xA0-0xFF之間是文字符號

編碼範圍

0x00-0xFF(0-255)

適用範圍以及存在問題

此字符集支持部分於歐洲使用的語言,包括阿爾巴尼亞語、巴斯克語、布列塔尼語、加泰羅尼亞語、丹麥語、荷蘭語、法羅語、弗裏西語、加利西亞語、德語、格陵蘭語、冰島語、愛爾蘭蓋爾語、意大利語、拉丁語、盧森堡語、挪威語、葡萄牙語、裏託羅曼斯語、蘇格蘭蓋爾語、西班牙語及瑞典語。

可是不支持中文和東亞等國的語言.

特性

單字節編碼

只佔用一個字節

高位能夠用,最多爲(11111111)

中文編碼系列

GB2312編碼

簡介

GB是」國標」兩字的拼音首字,2312是標準序號

GB2312編碼是第一個漢字編碼國家標準,由中國國家標準總局1980年發佈,1981年5月1日開始使用。GB2312編碼共收錄漢字6763個,其中一級漢字3755個,二級漢字3008個。同時,GB2312編碼收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裏爾字母在內的682個全角字符。

(GB2312中的字符是全角字符,ASCII原始的字符是半角字符)

編碼範圍

A1A1-FEFE(41377-65278)

其中漢字編碼範圍:B0A1-F7FE(45217-63486)。

適用範圍以及存在問題

基本知足了漢字的計算機處理須要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。但對於人名、古漢語等方面出現的罕用字和繁體字,GB 2312不能處理,所以後來GBK及GB 18030漢字字符集相繼出現以解決這些問題

中國大陸幾乎全部的中文系統和國際化的軟件都支持GB 2312

特性

分區表示

GB2312編碼對所收錄字符進行了「分區」處理,共94個區,每區含有94個位,共8836個碼位。這種表示方式也稱爲區位碼。

01-09區收錄除漢字外的682個字符。

10-15區爲空白區,沒有使用。

16-55區收錄3755個一級漢字,按拼音排序。

56-87區收錄3008個二級漢字,按部首/筆畫排序。

88-94區爲空白區,沒有使用。

舉例來講,「啊」字是GB2312編碼中的第一個漢字,它位於16區的01位,因此它的區位碼就是1601

雙字節編碼

GB2312規定對收錄的每一個字符采用兩個字節表示,第一個字節爲「高字節」,對應94個區;第二個字節爲「低字節」,對應94個位。因此它的區位碼範圍是:0101-9494。區號和位號分別加上0xA0就是GB2312編碼。例如最後一個碼位是9494,區號和位號分別轉換成十六進制是5E5E,0x5E+0xA0=0xFE,因此該碼位的GB2312編碼是FEFE。

GB2312編碼範圍:A1A1-FEFE,其中漢字的編碼範圍爲B0A1-F7FE,第一字節0xB0-0xF7(對應區號:16-87),第二個字節0xA1-0xFE(對應位號:01-94)

GBK編碼

簡介

即漢字國標擴展碼,

GBK編碼,是對GB2312編碼的擴展,所以徹底兼容GB2312-80標準。GBK編碼依然採用雙字節編碼方案,其編碼範圍:8140-FEFE,剔除xx7F碼位,共23940個碼位。共收錄漢字和圖形符號21886個,其中漢字(包括部首和構件)21003個,圖形符號883個。GBK編碼支持國際標準ISO/IEC10646-1和國家標準GB13000-1中的所有中日韓漢字,幷包含了BIG5編碼中的全部漢字。GBK編碼方案於1995年12月15日正式發佈,這一版的GBK規範爲1.0版。

Windows 95系統就是以GBK爲內碼,又因爲GBK同時也涵蓋了Unicode全部CJK漢字,因此也能夠和Unicode作一一對應

編碼範圍

8140-FEFE (33088-65278)

所有編碼分爲三大部分:1.漢字區;2.圖形符號區;3.用戶自定義區(詳情見特性碼位分配及順序)

適用範圍以及存在問題

幾乎完美支持漢字,可是不支持部分國家的語言(如一些東亞國家,日本等)

因此常常會有GBK到UNICODE的轉換

特性

字彙

GBK 規範收錄了 ISO 10646.1 中的所有 CJK 漢字和符號,並有所補充。具體包括:

  1. GB 2312 中的所有漢字、非漢字符號。
  2. GB 13000.1 中的其餘 CJK 漢字。以上合計 20902 個 GB 化漢字。
  3. 《簡化字總表》中未收入 GB 13000.1 的 52 個漢字。
  4. 《康熙字典》及《辭海》中未收入 GB 13000.1 的 28 個部首及重要構件。
  5. 13 個漢字結構符。
  6. BIG-5 中未被 GB 2312 收入、但存在於 GB 13000.1 中的 139 個圖形符號。
  7. GB 12345 增補的 6 個拼音符號。
  8. 漢字「○」。
  9. GB 12345 增補的 19 個豎排標點符號(GB12345 較 GB 2312 增補豎排標點符號 29 個,其中 10 個未被 GB 13000.1 收入,故 GBK 亦不收)。
  10. 從 GB 13000.1 的 CJK 兼容區挑選出的 21 個漢字。
  11. GB 13000.1 收入的 31 個 IBM OS/2 專用符號。
  12. 未錄入《新華字典》上的一些字,如「韡」的簡體。
碼位分配及順序

GBK 亦採用雙字節表示,整體編碼範圍爲 8140-FEFE,首字節在 81-FE 之間,尾字節在 40-FE 之間,剔除 xx7F 一條線。總計 23940 個碼位,共收入 21886 個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號 883 個。

誤處理

低字節是0x40-0x7E的GBK字符有必定特殊性,由於這些字符佔用了ASCII碼的位置,這樣會給一些系統帶來麻煩。

有些系統中用0x40-0x7E中的字符(如「|」)作特殊符號,在定位這些符號時又沒有判斷這些符號是否是屬於某個 GBK字符的低字節,這樣就會形成錯誤判斷。在支持GB2312的環境下就不存在這個問題。須要注意的是支持GBK的環境中小於0x80的某個字節未必就 是ASCII符號;另外就是最好選用小於0×40的ASCII符號作一些特殊符號,這樣就能夠快速定位,且不用擔憂是某個漢字的另外一半。Big5編碼中也存在相應問題。

雙字節編碼

遵循GB2312規定

BIG5 編碼

簡介

BIG5編碼又稱大五碼,是繁體中文字符集編碼標準,共收錄13060箇中文字,其中有二字爲重複編碼。

BIG5重複地收錄了兩個相同的字:「兀、兀」(A461及C94A)、「嗀、嗀」(DCD1及DDFC)。

編碼範圍

8140-FEFE(33088-65278)

其中漢字編碼範圍:A440-F9DC(42048-63964)

BIG5採用雙字節編碼,使用兩個字節來表示一個字符。高位字節使用了0x81-0xFE,低位字節使用了0x40-0x7E,及0xA1-0xFE

適用範圍以及存在問題

適用於臺灣和香港地區的繁體中文系統軟件等.不過因爲編碼自己存在的問題.已經基本改用Unicode編碼了.

兼容問題

因爲各廠商及政府推出的Big5延伸,彼此互不兼容,形成亂碼問題。

衝碼問題

由於低位元字符中包含了編程語言、shell、script 中,字串或命令常會用到的特殊字符,例如0x5C 「」、0x7C 「|」等。「」在許多用途的字串中是看成轉義符號又稱爲跳脫字符,例如 n(換行)、r(歸位)、t(tab)、\(自己符號)、"(引號)等等。而 「|」 在UNIX操做系統中大多看成命令管線的使用,如 "ls -la | more" 等等。若是在字串中有這些特殊的轉義字符,會被程式或直譯器解釋爲特殊用途。可是由於是中文的緣由,故沒法正確解釋爲上面所述的行爲,所以程式可能會忽略此轉義符號或是中斷執行。若此,就違反了使用者原本要當成中文字符一部份使用的本意。

在經常使用字如「功」(0xA55C)、「許」(0xB35C)、「蓋」(0xBB5C)、「育」(0xA87C)中時常出現,形成了許多軟件沒法正確處理以Big5編碼的字串或文件。這個問題被戲謔性地人名化,稱爲「許功蓋」或「許蓋功」(這三個字都有這種問題)。可是額外的困擾是,有些輸出功能並不會把「」看成特殊字符看待,因此有些程式或網頁就會錯誤地經常出如今「許功蓋」這些字後面多了「」。

私人造字

在倚天中文系統,以及後來的Windows3.一、95及98中,定義了四個私人造字區範圍:0xFA40-0xFEFE、0x8E40-0xA0FE、0x8140-0x8DFE、0xC6A1-0xC8FE。私人造字區的原意,是供使用者加入原本在編碼表中缺乏的字符,但當每一個使用者都在不一樣的地方加上不一樣的字符後,當交換資料時,對方便難以知道某一個編碼究竟想表達什麼字

特性

雙字節編碼

Big5是雙字節編碼,高字節編碼範圍是0x81-0xFE,低字節編碼範圍是0x40-0x7E和0xA1-0xFE。和GBK相比,少了低字節是0x80-0xA0的組合。0x8140-0xA0FE是保留區域,用於用戶造字區

字符有限

Big5收錄的漢字只包括繁體漢字,不包括簡體漢字,一些生僻的漢字也沒有收錄。GBK收錄的日文假名字符、俄文字符Big5也沒有收錄。由於Big5當中收錄的字符有限,所以有不少在Big5基礎上擴展的編碼,如倚天中文系統。Windows系統上使用的代碼頁CP950也能夠理解爲是對Big5的擴展,在Big5的基礎上增長了7個漢字和一些符號。Big5編碼對應的字符集是GBK字符集的子集,也就是說Big5收錄的字符是GBK收錄字符的一部分,但相同字符的編碼不一樣。

誤處理

由於Big5也佔用了ASCII的編碼空間(低字節所使用的0x40-0x7E),因此Big5編碼在一些環境下存在和GBK編碼相同的問題,即低字節範圍爲0x40-0x7E的字符有可能會被誤處理,尤爲是低字節是0x5C("/")和0x7C("|")的字符。能夠參考GBK一節相應說明。

GB18030編碼

簡介

2000年3月17日發佈的漢字編碼國家標準GB18030編碼,是對GBK編碼的擴充,覆蓋中文、日文、朝鮮語和中國少數民族文字,其中收錄27484個漢字。GB18030字符集採用單字節、雙字節和四字節三種方式對字符編碼。兼容GBK和GB2312字符集。

它徹底兼容ASCII碼與GBK碼。

編碼範圍

採用單字節、雙字節、四字節分段編碼方案,具體碼位見特性。

GB18030向下兼容ASCII碼和GBK編碼。

適用範圍以及存在問題

GB18030可用於一切處理中文(包括漢字和少數民族文)信息,特別是漢字信息的信息處理產品。

特性

這一標準進行了屢次拓展,如今使用的國標標準碼就是 GB18030-2005

單字節部分

本標準中,單字節的部分收錄了GB/T11383-1989的0x00到0x7F所有128個字符。

雙字節部分

本標準中,雙字節的部分收錄內容以下:

GB 13000.1-1993的所有CJK統一漢字字符。

GB 13000.1-1993的CJK兼容區挑選出來的21個漢字。

GB 13000.1-1993中收錄而GB 2312未收錄的我國臺灣地區使用的圖形字符139個。

GB 13000.1-1993收錄的其它字符31個。

GB 2312中的非漢字符號。

GB 12345 的豎排標點符號19個。

GB 2312未收錄的10個小寫羅馬數字。

GB 2312未收錄的帶音調的漢語拼音字母5個以及ɑ 和ɡ。

漢字數字「〇」。

表意文字描述符13個。

對GB 13000.1-1993增補的漢字和部首/構件80個。

雙字節編碼的歐元符號。

四字節部分

本標準的四字節的部分,收錄了上述雙字節字符以外的,GB 13000的CJK統一漢字擴充A、CJK統一漢字擴充B和已經在GB13000中編碼的我國少數民族文字的字符。

GB18030-2005最主要的變化是增長了CJK統一漢字擴充B。它還去掉了單字節編碼的歐元符號0x80)。

GB18030有1611668個碼位,在GB18030-2005中定義了76556個字符。隨着我國漢字整理和編碼研究工做的不斷深刻,以及國際標準ISO/IEC 10646的不斷髮展,GB18030所收錄的字符將在新版本中增長。

ANSI 編碼

簡介

(American National Standards Institute) 美國國家標準學會的縮寫

針對漢字的編碼,不一樣的國家和地區制定了不一樣的標準,由此產生了 GB23十二、GBK、Big五、Shift_JIS 等各自的編碼標準。這些使用 1 至 4 個字節來表明一個字符的各類漢字延伸編碼方式,稱爲ANSI 編碼。

例如:在簡體中文Windows操做系統中,ANSI 編碼表明 GBK 編碼;在繁體中文操做系統中,ANSI編碼表明Big5編碼;在日文Windows操做系統中,ANSI 編碼表明 Shift_JIS 編碼。

Unicode與UCS

簡介

到了全球互聯網時代,不一樣國家,不一樣地區須要進行交互,這時候因爲各自編碼標準都不同,彼此之間都是亂碼,沒法良好的溝通交流,因而這時候ISO組織與統一碼聯盟分別推出了UCS(Universal Multiple-Octet Coded Character Set)與Unicode。後來,二者意識到沒有必要用兩套字符集,因而進行了一次整合,到了Unicode2.0時代,Nnicode的編碼和UCS的編碼都基本一致(因此後續爲了簡便會贊成用Unicode指代),這時候全部的字符均可以採用同一個字符集,有着相同的編碼,能夠愉快的進行交流了。

須要注意的是UCS標準有本身的格式,如UCS-2(雙字節),UCS-4(四字節)等等
而Unicode也有本身的不一樣編碼實現,如UTF-8,UTF-16,UTF-32等等
其中UTF-16能夠認爲是UCS-2的拓展,UTF-32能夠認爲是UCS-4的拓展,而Unicode能夠認爲是Unicode最終用來制霸互聯網的一種編碼格式。

Unicode標準

Unicode(統一碼、萬國碼、單一碼、標準萬國碼)編碼就是爲了表達任意語言的任意字符而設計

在這套系統中: 一個字符表明一個code,不存在二義性,例如U+0041老是表明'A',並且這套標準也會隨着需求不斷的拓展。

Unicode是一個標準,只規定了某個字符應該對應哪個code,可是並無規定這個字符應該用即爲字節來存儲。規定用幾個字節存儲字符的是Unicode的不一樣實現,譬如UTF-8,UTF-16等

Unicode編碼的不一樣實現

UTF-8編碼

簡介

UTF-8是Unicode的一種實現方式,是一種變長編碼,根據不一樣的Unicode字符,用1到6個字節編碼。

UTF-8的字節結構有特殊要求,好比咱們說一個漢字的範圍是0X4E00到0x9FA5,是指Unicode值,至於放在UTF-8的編碼裏去就是由三個字節來組織。

編碼範圍

全部的Unicode碼。

適用範圍以及存在問題

適用於全部地方,特別是互聯網上,現今UTF-8基本已經制霸互聯網。

中文中的缺點

UTF-8在中文字符處理時,通常都是3個字節,這樣相比GBK,UTF-16等編碼,會更浪費空間(可是針對英文又有自然的優點-單字節)

並且由於每一個字符使用不一樣數量的字節編碼,因此尋找串中第N個字符是一個O(N)複雜度的操做 — 即,串越長,則須要更多的時間來定位特定的字符。同時,還須要位變換來把字符編碼成字節,把字節解碼成字符。

特性

變長編碼

根據不一樣的Unicode字符,用1到6個字節編碼,並且徹底兼容ASCII碼

UTF-8是採用變長的編碼方式,爲1~6個字節,但一般咱們只把它看做單字節或三字節的實現,由於其它狀況實在少見。UTF-8編碼經過多個字節組合的方式來顯示,這是計算機處理UTF-8的機制,它是無字節序之分的,而且每一個字節都很是有規律

UTF-16編碼

簡介

Unicode編碼中,最經常使用的字符實際上是0-65535,所以針對這點產生了UTF-16方案。

UTF-16將0–65535範圍內的字符編碼成2個字節,超過這個的用4個字節編碼。(所以基本能夠認爲是雙字節的)

UTF-16是徹底對應於UCS-2的,即把UCS-2規定的代碼點經過Big Endian或Little Endian方式直接保存下來。因此UTF-16採用2個字節來存儲Unicode。UTF-16也能夠表示UCS-4的部分字符,因此UTF-16也採用4個字節來存儲Unicode。

UTF16編碼是Unicode最直接的實現方式,一般咱們在windows上新建文本文件後保存爲Unicode編碼,其實就是保存爲UTF16編碼。

編碼範圍

全部的Unicode碼。

適用範圍以及存在問題

雙字節編碼相比UTF-8更利於存儲漢字字符。

Tips: JavaScript的內置的實現能夠認爲是UCS-2(而且它的存儲方式爲大端序),而UTF-16是UCS-2的拓展。

特性

雙字節和四字節編碼

因爲UTF-16固定是兩字節的(UCS-4部分字符4字節),因此沒法支持單字節的ASCII碼

大端序和小端序

UTF-16和UTF-32都有大端序和小端序問題。

UTF-32編碼

簡介

UTF-32是Unicode的一種實現方式.
UTF32編碼使用固定的4個字節來存儲。
所以,很是浪費空間,不利於網絡傳輸,因此使用不廣泛。

編碼範圍

全部的Unicode碼。

適用範圍以及存在問題

不建議使用。

Tips:  HTML5中明確規定禁止使用Utf-32編碼。

特性

四字節編碼

UTF-32固定使用四個字節來存儲。

附錄

博客

初次發佈2017.05.17於我的博客

http://www.dailichun.com/2017/05/17/severalCommonlyCharEncoding.html

參考資料

相關文章
相關標籤/搜索