1946 年,世界第一臺計算機誕生了。計算機由硬件和系統軟件組成,它最基本的功能就是存儲、表示與處理信息。通俗地說,信息其實就是由各類各樣的字符組成,好比英文字母、漢字以及其餘國家的語言等。那麼計算機如何才能表示這些各類各樣的字符呢?網絡
因而有一羣人想到,咱們能夠用8個晶體管的「通」或「斷」組合出一些不一樣的狀態,來表示信息。「通」用 1 表示,「斷」用 0 表示,這樣一個由值 0 和 1 組成的長度爲 8 的位序列,就表明着一個字節,八個二進制位能夠組合出 256 種狀態,這樣一個字節就能夠表示 256 種字符。編碼
計算機最早只在美國使用,他們把全部的空格、標點符號、數字、大小寫字母分別用單個字節表示,一直編到了第128個,這樣計算機就能夠用不一樣字節來存儲英語的文字了,因而美國製定了一套 ASCII 編碼標準,用來規定這種英語字符與二進制位之間的關係。spa
這種方式就是用一個惟一的單字節大小的整數值來表示每一個字符。ASCII 碼一共規定了 128 個字符的編碼,這 128 個符號,只佔用了一個字節的後面 7 位,最前面的一位統一規定爲 0。好比空格 SPACE 是 32(二進制00100000),大寫的字母A是65(二進制01000001)。code
後來,世界各地都開始使用計算機,128 個字符對於英語字符確實夠用了,但用來表示其餘語言就有些捉襟見肘了。好比法語中,字母上方有注音符號,因而,一些歐洲國家就決定,利用字節中閒置的最高位編入新的符號。這樣一來,這些歐洲國家的編碼體系,能夠表示最多 256 個字符了。所以 EASCII(Extended ASCII,延伸美國標準信息交換碼)應運而生。下圖是 EASCII 碼比 ASCII 碼擴充出來的符號包括表格符號、計算符號、希臘字母和特殊的拉丁符號:orm
可是等計算機發展到中國,256種符號用來表示咱們這10萬左右的漢字就遠遠不夠了,單個字節不夠,咱們就用兩個字節組合起來表示呀,因而咱們規定,一個小於 127 的字符的意義與原來相同,但兩個大於 127 的字符連在一塊兒時,就表示一個漢字,前面的一個字節(稱之爲高字節)從 0xA1 用到 0xF7,後面一個字節(稱之爲低字節)從 0xA1 用到 0Xfe,這樣咱們能夠組合出大約 7000 多個簡體漢字了。ip
因而 1981 年,國家標準化管理委員會正式制訂了中華人民共和國國家標準簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,項目代號爲 GB 2312。開發
可是又考慮到港澳臺同胞使用的繁體字並無收錄到GB2312編碼,因而信息工業策進會在1984年與臺灣13家廠商簽訂「16位我的電腦套裝軟件合做開發(BIG-5)計劃」,開始編寫並推出了BIG5標準。it
隨着計算機的飛速發展,各個國家都開始制定本身的編碼標準,這樣致使了國家之間誰也不懂別人的編碼,不支持別人的編碼,這時候要是將全世界全部的字符包含在一個集合裏,有一個統一的字符集就行了,就不會再有亂碼的問題。io
因而有兩個組織都開始研究這件事,1984 年 ISO/IEC 小組成立,隨後 1988 年統一碼聯盟成立,後來他們發現各自在作相同的工做,因而兩個組織決定合併字符集。國際組織所以發行了一個全球統一編碼表,把全球各國文字都統一在一個編碼標準裏,名爲 Unicode。1991 年,兩個組織共同的工做成果 Unicode 1.0 正式發佈,不過 Unicode 1.0 並不包含 CJK 字符(即中日韓)。form
1993 年,ISO/IEC 小組發表了 ISO/IEC 10646 標準,ISO 10646 標準中定義的字符集爲 UCS。UCS 是一個超大的字符集,它有兩種編碼方案:UCS-2 和UCS-4,Unicode 默認以 UCS-2 編碼。
咱們能夠把 Unicode 看做是一個標準或組織,而 UCS 就是一個字符集,那麼 UCS 在網絡中的傳輸標準就是 UTF 。UTF 是Unicode Transformation Format 的縮寫,中文譯做 Unicode 轉換格式。UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式。其餘實現方式還包括 UTF-16(字符用兩個字節或四個字節表示)和 UTF-32(字符用四個字節表示)。
UTF-32的編碼方法是,每一個碼點使用四個字節表示,字節內容一一對應碼點。好比:
U+0000 = 0x0000 0000
U+597D = 0x0000 597D
UTF-32 的優勢在於,轉換簡單直觀,查找效率高,時間複雜度只爲 O(1)。缺點在於浪費空間,一樣內容的英語文本,它會比 ASCII 編碼大四倍。因此不推薦使用這種編碼方法,HTML 5 標準就明文規定,網頁不得編碼成 UTF-32。
UTF-8 最大的一個特色,就是它是一種變長的編碼方式。它使用 1~4 個字節表示一個符號,根據不一樣的符號而變化字節長度。這樣對於存儲來講並無形成極大的浪費,節省了許多空間。
UTF-8 的編碼規則有二條:
1)對於單字節的符號,字節的第一位設爲 0,後面 7 位爲這個符號的 Unicode 碼。所以對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。
2)對於 n 字節的符號(n > 1),第一個字節的前n 位都設爲 1,第 n + 1 位設爲 0,後面字節的前兩位一概設爲 10。剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼。
如此一來:
例如,希伯來語字母 aleph(א)的 Unicode 代碼是 U+05D0,按照如下方法改爲 UTF-8:
UTF-16 編碼介於 UTF-32 與 UTF-8 之間,同時結合了定長和變長兩種編碼方法的特色。長度爲 2 個字節(基本平面:U+0000 到 U+FFFF)或 4 個字節(輔助平面:U+010000 到 U+10FFFF)。128 個 ASCII 字符需兩個字節編碼,而其餘字符使用四個字節編碼。
當咱們要轉成 UTF-16 的時候,首先區分這是基本平面字符,仍是輔助平面字符。若是是前者,直接將碼點轉爲對應的十六進制形式,長度爲兩字節。好比 U+597D = 0x597D。若是是輔助平面字符,則根據轉碼公式進行計算。
做爲邏輯意義上的 UTF-16 編碼(碼元序列),因爲歷史的緣由,在映射爲物理意義上的字節序列時,分爲 UTF-16BE( Big Endian )、UTF-16LE( Little Endian )兩種狀況。好比,「ABC」 這三個字符的 UTF-16 編碼(碼元序列)爲:00 41 00 42 00 43;其對應的各類字節序列以下:
Windows 平臺下的 UTF-16 編碼(即上述的FF FE 41 00 42 00 43 00) 默認爲帶有 BOM 的小端序(即Little Endian with BOM)。
Little endian 和 Big endian
Unicode 規範定義,每個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫作"零寬度非換行空格"(zero width no-break space),用 FEFF 表示。這正好是兩個字節,並且 FF 比 FE 大 1。
若是一個文本文件的頭兩個字節是 FE FF,就表示該文件採用大頭方式;若是頭兩個字節是 FF FE,就表示該文件採用小頭方式。
BOM (Byte order Mark)
Unicode 規範中推薦的標記字節順序的方法是 BOM。它出如今文本文件頭部,用於標識文件是採用哪一種格式的編碼。
1993 年,包含 CJK 的 Unicode 1.1 已經發布了,因而在同一年,中國大陸制定了 GB13000.1-93 國家編碼標準(簡稱 GB13000)。此標準等同於 ISO/IEC 10646.1:1993 和 Unicode 1.1。
隨着我的計算機在中國的流行,微軟開始意識到中國是一個巨大的市場,因而 1995 年,微軟利用了 GB2312 中未使用的編碼空間,收錄了 GB13000 中的全部字符制定了漢字內碼擴展規範 GBK。因此 GBK 是向下徹底兼容 GB2312 的。
GBK 共收入 21886 個漢字和圖形符號,包括:
GBK 採用雙字節表示,整體編碼範圍爲 8140-FEFE 之間,首字節在 81-FE 之間,尾字節在 40-FE 之間,剔除 XX7F 一條線。GBK 編碼區分三部分:漢字區、圖形符號區、用戶自定義區。
考慮到 GBK 只包含了大部分的漢字和繁體字等,咱們的少數民族的本身的漢字並無考慮在內,因而在 2000 年,電子工業標準化研究所起草了 GB18030 標準,項目代號 「GB 18030-2000」,全稱《信息技術-信息交換用漢字編碼字符集-基本集的擴充》。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。