位(bit):是計算機 內部數據 儲存的最小單位,11001100是一個八位二進制數。數據庫
字節(byte):是計算機中 數據處理 的基本單位,習慣上用大寫 B 來表示,1B(byte,字節)= 8bit(位)框架
字符:是指計算機中使用的字母、數字、字和符號編碼
ASCIIS碼: 1個英文字母(不分大小寫)= 1個字節的空間操作系統
1箇中文漢字 = 2個字節的空間.net
1個ASCII碼 = 一個字節翻譯
UTF-8編碼:1個英文字符 = 1個字節3d
英文標點 = 1個字節code
1箇中文(含繁體) = 3個字節blog
中文標點 = 3個字節ci
Unicode編碼:1個英文字符 = 2個字節
英文標點 = 2個字節
1箇中文(含繁體) = 2個字節
中文標點 = 2個字節
數據存儲是以「字節」(Byte)爲單位,數據傳輸大可能是以「位」(bit,又名「比特」)爲單位,一個位就表明一個0或1(即二進制),每8個位(bit,簡寫爲b)組成一個字節(Byte,簡寫爲B),是最小一級的信息單位。
B與iB
1KiB(Kibibyte)=1024byte
1KB(Kilobyte)=1000byte
1MiB(Mebibyte)=1048576byte
1MB(Megabyte)=1000000byte
硬盤生產商是以GB(十進制),即10的3次方=1000,如1MB=1000KB)計算的,而電腦(操做系統)是以GiB(2進制,即2的10次方, 如1MiB=1024KiB)計算的,可是國內用戶通常理解爲1MiB=1M=1024 KB, 因此爲了便於中文化的理解,翻譯MiB爲MB也是能夠的。
一樣根據硬盤)廠商與用戶對於1MB大小的不一樣理解,因此好多160G的硬盤實際容量按計算機實際的1MiB=1024KB算都不到160G,這也能夠解釋爲何新買的硬盤「缺斤短兩」並無它所標示的那麼大。
國際單位制(SI):
1KB=1024B;1MB=1024KB=1024×1024B。
1B(byte,字節)= 8 bit(見下文);
1KB(Kilobyte,千字節])=1024B= 2^10 B;
1MB(Megabyte,兆字節,百萬字節,簡稱「兆」)=1024KB= 2^20 B;
1GB(Gigabyte,吉字節,十億字節,又稱「千兆」)=1024MB= 2^30 B;
1TB(Terabyte,萬億字節,太字節)=1024GB= 2^40 B;
1PB(Petabyte,千萬億字節,拍字節)=1024TB= 2^50 B;
1EB(Exabyte,百億億字節,艾字節)=1024PB= 2^60 B;
1ZB(Zettabyte,十萬億億字節,澤字節) =102424EB= 2^70 B;
1YB(Yottabyte,一億億億字節,堯字節)= 1024ZB= 2^80 B;
1BB(Brontobyte,一千億億億字節)= 1024YB= 2^90 B;
1NB(NonaByte,一百萬億億億字節) = 1024BB = 2^100 B;
1DB(DoggaByte,十億億億億字節) = 1024 NB = 2^110 B;
數據存儲是以10進製表示,數據傳輸是以2進製表示的,因此1KB不等於1000B。
ASCII
ASCII是7比特的字符集,涵蓋了英語中的絕大多數字符。編碼從0到127.
ASCII碼實現的是大小寫英文字母,阿拉伯數字,及經常使用的標點符、運算符、控制字符(換行、刪除等)和通訊字符(文頭、確認等)與計算機編碼之間的對應。ASCII編碼採用單字節(8 Bit)存儲,實際數據存儲空間是7 Bit,最高位的1 Bit是奇偶校驗位。
ASCII編碼對於英語國家足夠用了,可是卻沒法表達非英語國家字符到計算機編碼之間的映射,如中文漢字、法語字母等。因此,出現了不少非ASCII編碼(但大多數都是兼容ASCII碼的)。
ISOLatin-1(the ISO-8859-1 standard)
ISO Latin-1是8比特的字符集,定義了256個字符。前128個字符(00000000-01111111)與ASCII徹底一致。
Latin1是ISO-8859-1的別名,有些環境下寫做Latin-1。Latin1編碼是單字節編碼,向下兼容ASCII,其編碼範圍是0x00-0xFF,0x00-0x7F之間徹底和ASCII一致,0x80-0x9F之間是控制字符,0xA0-0xFF之間是文字符號。
ASCII編碼是一個7位的容器,ISO-8859-1編碼是一個8位的容器。
由於Latin1編碼範圍使用了單字節內的全部空間,在支持Latin1編碼的系統中傳輸和存儲其餘任何編碼的字節流都不會被拋棄。換言之,把其餘任何編碼的字節流看成Latin1編碼看待都沒有問題。這是個很重要的特性,MySQL數據庫默認編碼是Latin1就是利用了這個特性。
Unicode
世界上存在着多種編碼方式,同一個二進制數字能夠被解釋成不一樣的符號。所以,要想打開一個文本文件,就必須知道它的編碼方式,不然用錯誤的編碼方式解讀,就會出現亂碼。爲何電子郵件經常出現亂碼?就是由於發信人和收信人使用的編碼方式不同。
能夠想象,若是有一種編碼,將世界上全部的符號都歸入其中。每個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode。
Unicode固然是一個很大的集合,如今的規模能夠容納100多萬個符號。每一個符號的編碼都不同須要注意的是,Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。
若是全部字符都按照最大存儲空間存儲,那必然會浪費很大的空間,好比全部字符都按照3字節存儲,可是英文字母只須要一個字節存儲就夠了,就等於說一個Unicode編碼的英文文檔是ASCII編碼文檔存儲空間的三倍。
因此,便有了變長編碼—-UTF-8。
Unicode只是定義了字符的編碼值,並未指定值以何種形式存儲。好比漢字「田」的Unicode編碼是7530,轉換爲二進制是01110101,00110000。比方如今定義一種unicode的實現方式UTF-FAKE,規則是
a. 使用24個字節
b. 每一個字節的高7位都是1
c. 每一個字節的最末一位存儲unicode編碼值
那麼01110101,00110000的存儲形式是
11111110, 11111110, 11111110, 11111110, 11111110, 11111110, 11111110, 11111110,
11111110, 11111111, 11111111, 11111111, 11111110, 11111111, 11111110, 11111111,
11111110, 11111110, 11111111, 11111111, 11111110, 11111110, 11111110, 11111110
其中末位爲藍色0的字節爲補足字節。
實際使用的編碼方式UTF-8使用三個字節存儲「田」 01110101,00110000,以下
11100111, 10010100, 10110000
Unicode的第一個版本於1991年發佈,該版本容許的的最大編碼空間是兩個字節。96年發佈的Unicode 2.0版本引入了surrogate pair,將Unicode的編碼數目擴充到了百萬級,因爲可見的未來該數目不大可能用光,所以Unicode委員會對外宣稱該上限永不會更改。Surrogate pair在UTF-16和UTF-32中獲得了實現。Unicode的前256個字符及編碼值與Latin-1徹底一致。好比大寫字母A在Latin-1和Unicode中的編碼值都是0x41(十進制的65)。
Unicode的編碼值範圍是 000000hex 到10FFFFhex,可劃分爲17個plane,每一個plane包含65536(= 216)個字符。Plane的代碼從0到16(十進制),對應於 000000hex,010000hex,020000hex,… … ,0F0000hex,10FFFFhex的藍色部分。
Unicode的表示方式通常是」U+」後綴上4到6個十六進制字符,如」田「的Unicode表示方式是U+7530。
UTF-8
UTF-8就是在互聯網上使用最廣的一種Unicode的實現方式。其餘實現方式還包括UTF-16和UTF-32,不過在互聯網上基本不用。
UTF-8最大的一個特色,就是它是一種變長的編碼方式。它可使用1~4個字節表示一個符號,根據不一樣的符號而變化字節長度。如ASCII編碼的內容UTf-8中就是用一個字符存儲的。
UTF-8採用可變長度的編碼,長度從1到4個字節不等。某些應用識別非標準的"utf8" 或"UTF 8"別名。只有ASCII字符在UTF-8中使用一個字節編碼,且值與ASCII徹底相同,其他字符在UTF-8中使用2到4個字節。所以UTF-8中的單字節且只有單字節編碼字符的最高的1個比特是0。
UTF-8對Unicode字符的編碼規則以下
說明以下:
仍是以漢字」田「爲例,展現Unicode字符如何按照UTF-8存儲。」田「的Unicode值是U+7530,比對上表發現介於U+0800 - U+FFFF之間,所以須要3個字節來存儲。7530轉爲二進制是1110101,00110000,一共15位。但因爲UTF-8的3字節編碼存儲16個比特,所以將1110101,00110000的高一位補零變成16比特01110101,00110000。而後將這16比特依次填入三字節序列1110xxxx 10xxxxxx 10xxxxxx的x中,獲得結果
11100111 10010100 10110000,寫成16進制就是E7 94 B0
注意:雖然Unicode中的前256個字符及編碼值與Latin-1徹底一致,但UTF-8只對前128個即ASCII字符采用單字節編碼,其他128個Latin-1字符是採用2個字節編碼。所以ASCII編碼的文件能夠直接以UTF-8方式讀取,而Latin-1的文件若包含值爲128-255的字符則不能夠。
UTF-8是一種變長字節編碼方式。對於某一個字符的UTF-8編碼,若是隻有一個字節則其最高二進制位爲0;若是是多字節,其第一個字節從最高位開始,連續的二進制位值爲1的個數決定了其編碼的位數,其他各字節均以10開頭。UTF-8最多可用到6個字節。
如表:
1字節 0xxxxxxx
2字節 110xxxxx 10xxxxxx
3字節 1110xxxx 10xxxxxx 10xxxxxx
4字節 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字節 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字節 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx Unicode
UNICODE UTF8轉換規則
符號範圍 | UTF-8編碼方式
(十六進制) | (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面,仍是以漢字「嚴」爲例,演示如何實現UTF-8編碼。
下面,仍是以漢字「嚴」爲例,演示如何實現UTF-8編碼。
已知「嚴」的unicode是4E25(100111000100101),根據上表,能夠發現4E25處在第三行的範圍內(0000 0800-0000 FFFF),所以「嚴」的UTF-8編碼須要三個字節,即格式是「1110xxxx 10xxxxxx 10xxxxxx」。而後,從「嚴」的最後一個二進制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就獲得了,「嚴」的UTF-8編碼是「11100100 10111000 10100101」,轉換成十六進制就是E4B8A5。
UTF-16
UTF-16也是採用可變長度編碼,能夠是一個或者兩個16比特。某些應用中容許使用非標準的UTF_16或者UTF16做爲別名。Unicode中的第一個plane的65536(= 216)codepoints採用16比特編碼,其他的16個plane均採用2個16比特編碼。採用2個16比特編碼的先後兩個16bit分別稱爲lead surrogate pair和trail surrogate pair,之因此稱爲surrogate是由於單獨一個16bit不表明任何字符,只有組合起來纔有意義。
既然UTF-16也是可變長度編碼,如何區分某個16bit是單獨表示一個字符仍是與後續的16bit組合起來表示一個字符呢?Unicode將D800–DBFF和DC00–DFFF這兩個範圍做爲保留區間,沒有將之分配給任何Unicode字符,若某16比特落在D800–DBFF範圍內,即可將之視爲採用2個16bit編碼字符的第一個16bit,而落在DC00–DFFF的16bit可視爲採用2個16bit編碼字符的第二個16bit。這就使得Unicode第一個plane實際可分配使用的code points只有65536 – (DFFF - D800 + 1) = 65536 – 8*256 = 63488。
採用一個16bit編碼的Unicode字符在UTF-16中的編碼值與其在Unicode中是相等的,好比英文大寫字母A的Unicode值是U+0041,其UTF-16編碼是0041 hex 。Unicode第二到第十七個plane採用兩個16bit即surrogate pairs的字符從其Unicode code point到UTF-16的轉換規則是
這樣UTF-16與UTF-8都是self-synchronizing的,即某個16bit是不是一個字符的開始無需檢查其前一個或者後一個16bit。與UTF-8的不一樣之處是,UTF-16不支持從某個隨機的字節開始讀取。
舉例:UTF-16 序列 0041, D801DC01 (字符"A"),若第一個字節丟失即從第二個字節讀取,那麼UTF-16認爲序列是41D8,01DC,01;而UTF-8不存在這個問題。
GKB
GBK 是又一個漢字編碼標準,全稱《漢字內碼擴展規範》(GBK),英文名稱 Chinese Internal Code Specification ,中華人民共和國全國信息技術標準化技術委員會 1995 年 12 月 1 日製訂,國家技術監督局標準化司、電子工業部科技與質量監督司 1995 年 12 月 15 日聯合以技監標函 [1995] 229 號文件的形式,將它肯定爲技術規範指導性文件,發佈和實施。這一版的 GBK 規範爲 1.0 版。GB 即「國標」,K 是「擴展」的漢語拼音第一個字母。
GBK 向下與 GB 2312 編碼兼容,向上支持 ISO 10646.1 國際標準,是前者向後者過渡過程當中的一個承上啓下的標準。
ISO 10646 是國際標準化組織 ISO 公佈的一個編碼標準,即 Universal Multilpe-Octet Coded Character Set(簡稱 UCS),大陸譯爲《通用多八位編碼字符集》,臺灣譯爲《廣用多八位元編碼字元集》,它與 Unicode 組織的 Unicode 編碼徹底兼容。ISO 10646.1 是該標準的第一部分《體系結構與基本多文種平面》。我國 1993 年以 GB 13000.1 國家標準的形式予以承認(即 GB 13000.1 等同於 ISO 10646.1)。
ISO 10646 是一個包括世界上各類語言的書面形式以及附加符號的編碼體系。其中的漢字部分稱爲「CJK 統一漢字」(C 指中國,J 指日本,K 指朝鮮)。而其中的中國部分,包括了源自中國大陸的 GB 23十二、GB 1234五、《現代漢語通用字表》等法定標準的漢字和符號,以及源自臺灣的 CNS 11643 標準中第 一、2 字面(基本等同於 BIG-5 編碼)、第 14 字面的漢字和符號。
1、字彙
GBK 規範收錄了 ISO 10646.1 中的所有 CJK 漢字和符號,並有所補充。具體包括:
2、碼位分配及順序
GBK 亦採用雙字節表示,整體編碼範圍爲 8140-FEFE,首字節在 81-FE 之間,尾字節在 40-FE 之間,剔除 xx7F 一條線。總計 23940 個碼位,共收入 21886 個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號 883 個。
所有編碼分爲三大部分:
3、字形
GBK 對字形做了以下的規定:
GBK編碼是在GB2312-80(也稱做GB2312,GB碼)標準基礎上的內碼擴展規範,使用了雙字節編碼方案。
GBK是國家標準GB2312基礎上擴容後兼容GB2312的標準。GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,爲了區分中文,將其最高位都設定成1。GBK包含所有中文字符,是國家編碼,通用性比UTF8差,不過UTF8佔用的數據庫比GBK大
GBK、GB2312等與UTF8之間都必須經過Unicode編碼才能相互轉換:
GBK、GB2312<= = =>Unicode<= = =>UTF8
補充:
GB2312 最先一版的中文編碼,每一個字佔據2bytes。因爲要和ASCII兼容,那這2bytes最高位不能夠爲0 了(不然和ASCII會有衝突)。在GB2312中收錄了6763個漢字以及682個特殊符號,已經囊括了生活中最 經常使用的全部漢字。
GBK 因爲GB2312只有6763個漢字,我漢語博大精深,只有6763個字怎麼夠?因而GBK中在保證不和 GB23十二、ASCII衝突(即兼容GB2312和ASCII)的前提下,也用每一個字佔據2bytes的方式又編碼了許多 漢字。通過GBK編碼後,能夠表示的漢字達到了20902個,另有984個漢語標點符號、部首等。值得注意 的是這20902個漢字還包含了繁體字。
GB18030 然而,GBK的兩萬多字也已經沒法知足咱們的需求了,還有更多可能你本身歷來沒見過的漢字 須要編碼。這時候顯然只用2bytes表示一個字已經不夠用了(2bytes最多隻有65536種組合,然而爲了和 ASCII兼容,最高位不能爲0就已經直接淘汰了一半的組合,只剩下3萬多種組合沒法知足所有漢字求)。 所以GB18030多出來的漢字使用4bytes編碼。固然,爲了兼容GBK,這個四字節的前兩位顯然不能與 GBK衝突(實操中發現後兩位也並無和GBK衝突)。我國在2000年和2005年分別頒佈的兩次GB18030 編碼,其中2005年的是在2000年基礎上進一步補充。至此,GB18030編碼的中文文件已經有七萬多個漢 字了,甚至包含了少數民族文字。
這圖中展現了前文所述的幾種編碼在編碼完成後,前2個byte的值的範圍(用16進製表示)。每一個byte能夠表 示00到FF(即0至255)。從圖中咱們能夠一目瞭然地看到爲何GB18030能夠兼容GBK,GB2312和ASCII 了。他們幾種編碼之間前兩位沒有重合部分。須要注意的是ASCII只有1byte,因此是沒有第二位的。另外 GB18030在上圖中佔的面積雖然很小,可是它是4bytes編碼,這圖只展現了前兩位。若是後兩位也算上, GB18030的字數要遠多於GBK。另外須要注意的是,因爲GBK兼容GB2312,所以屬於GB2312的藍色區域其 實也能夠算做是GBK的區域。同理GBK的區域理論上也屬於GB18030的區域。上表中只是展現了多出來的部 分。
實際生活中,咱們用到的99%以上的漢字,其實都在GB2312那一塊區域內。至於GB2312每一個編碼對應的到 底是哪一個漢字本文再也不贅述,能夠參考連接(連接地址)查詢。GBK編碼所對應的漢字能夠參考連接 (連接地址)查詢。至於GB18030編碼,因爲字數實在太多太難寫,已經很難在網上找到在線的編碼全表 了。不過通過一番搜尋,仍是找到了我國發布GB18030編碼時的相關文檔(GB18030-2005文檔、 GB18030-2000文檔)。
在實際使用中,GBK編碼已經能夠知足大部分場景了,GB18030編碼中全部漢字都是咱們這輩子都不必定能 見到的文字,這也是平時爲何常常會使用GBK的緣由吧。