带你了解常见的编码表,以及他们自己的关系.
一:ASCII?
? ? ? 世界上雖然有各種各樣的字符,但計算機發明之初沒有考慮那么多,基本上只考慮了美國的需求,美國大概只需要128個字符,美國就規定了這128個字符的二進制表示方法,這個方法是一個標準,稱為ASCII編碼,全稱是American Standard Code for Information Interchange,美國信息互換標準代碼。128個字符用7個位剛好可以表示,計算機存儲的最小單位是byte,即8位,ASClI碼中最高位設置為O,用剩下的7位表示字符。這7位可以看做數字0到127,ASCII碼規定了從0到127個,每個數字代表什么含義。我們先來看數字32到126的含義,如下圖所示,除了中文之外,我們平常用的字符基本都涵蓋了,鍵盤上的字符大部分也都涵蓋了。
注意: 數字32到126表示的這些字符都是可打印字符,0到31和127表示一些不可以打印的字符,這些字符一般用于控制目的,這些字符中大部分都是不常用的,下表列出了其中相對常用的字符。
舉一個例子:
package com.itheima. stringDemo;public class Demo1 {public static void main(String[] args) {char c = 9;System.out.print(c);System.out. println(黑馬");} }編譯結果:
Asci碼對美國是夠用了,但對別的國家而言卻是不夠的,于是,各個國家的各種計算機廠商就發明了各種各樣的編碼方式以表示自己國家的字符,為了保持與Ascii碼的兼容性,一般都是將最高位設置為1。也就是說,當最高位為O時,表示Ascii碼,當為1時就是各個國家自己的字符。在這些擴展的編碼中,在西歐國家中流行的是ISO 8859-1和Windows-1252,在中國是GB2312,GBK,GB18030和Big5,我們逐個來研究這些編碼。
二: ISO 8859-1
? ? ? ? ? ? ? ?ISO 8859-1又稱Latin-,它也是使用一個字節表示一個字符,因為西歐的文字也都是字母拼接,只不過不是26個英文字母罷了,其中0到127與Asci—樣,128到255規定了不同的含義。在128到255中,128到159表示一些控制字符,這些字符也不常用,就不介紹了。160到255表示一些西歐字符,如下圖所示:
?三: windows-1252
? ? ? ?IS0 8859-1雖然號稱是標準,用于西歐國家,但它連歐元(C)這個符號都沒有,因為歐元比較晚,而標準比較早。實際使用中更為廣泛的是Windows-1252編碼,這個編碼與ISO8859-1基本是一樣的,區別只在于數字128到159,Windows-1252使用其中的一些數字表示可打印字符,這些數字表示的含義,如下圖所示:;
注意: 這個編碼中加入了歐元符號以及一些其他常用的字符。基本上可以認為,ISO8859-1已被Windows-1252取代,在很多應用程序中,即使文件聲明它采用的是ISO 8859-1編碼,解析的時候依然被當做Windows-1252編碼。
四:??GB2312
? ? ? ?美國和西歐字符用一個字節就夠了,但中文顯然是不夠的。中文第一個標準是GB2312。GB23.1.2標準主要針對的是簡體中文常見字符,包括約7000個漢字,不包括一些罕見詞,不包括繁體字。GB2312固定使用兩個字節表示漢字,在這兩個字節中,最高位都是1,如果是0,就認為是Ascii字符。在這兩個字節中,其中第一個字節范圍是1010 0001(十進制161)-11110111(十進制247),第二個字節范圍是10100001(十進制1611-11111110(十進制254)。
比如,"賢哥"的GB2312編碼是
?五: GBK
? ? ? GBK建立在GB2312的基礎上,向下兼容GB231.2,也就是說,GB231.2編碼的字符的二進制表示,在GBK編碼里是完全一樣的。GBK增加了一萬四千多個漢字,共計約21000漢字,其中包括繁體字。GBK同樣使用固定的兩個字節表示,其中第一個字節范圍是1000 0001(十進制129)- 11111110(十進制254),第二個字節范圍是01000000(十進制64)-01111110(十進制126)和1000 0000(十進制128)-11111110(十進制254)。
? ? ? ?疑問:?需要注意的是,第二個字節是從64開始的(64屬于byte正數范圍,和ASCII的編碼重合了),也就是說,第二個字節最高位可能為0。那怎么知道它是漢字的一部分,還是一個ASCII字符呢?
? ? ? ?其實很簡單,因為漢字是用固定兩個字節表示的,在解析二進制流的時候,如果第一個字節的最高位為1,那么就將下一個字節讀進來一起解析為一個漢字,而不用考慮它的最高位,解析完后,跳到第三個字節繼續解析。
六:?GB18030
? ? ? ?GB18030向下兼容GBK,增加了五萬五千多個字符,共七萬六千多個字符。包括了很多少數民族字符,以及中日韓統一字符。用兩個字節已經表示不了GB18030中的所有字符,GB18030使用變長編碼,有的字符是兩個字節,有的是四個字節。在兩字節編碼中,字節表示范圍與GBK一樣。在四字節編碼中,第一個字節的值從10000001(十進制129)到11111110(十進制254),第二個字節的值從0011 0000(十進制48)到00111001(十進制57),第三個字節的值從1000 0001(十進制129)到11111110(十進制254),第四個字節的值從0011 0000(十進制48)到0011 1001(十進制57)。
? ? ? ?疑問: 解析二進制時,如何知道是兩個字節還是四個字節表示一個字符呢?
? ? ? ??很簡單,看第二個字節的范圍,如果是48到57就是四個字節表示,因為兩個字節編碼中第二字節都比這個大。所以這樣綜合說明GB18030兼容GBK,兼容GB2312,兼容ASCII,但是GB18030,GBK,GB2312這三個編碼和S08859-1是不兼容的哦。
七: Big5
? ? ? ? Big5是針對繁體中文的,廣泛用于臺灣香港等地。Big5包括1萬3千多個繁體字,和GB2312類似,一個字符同樣固定使用兩個字節表示。在這兩個字節中,第一個字節范圍是10000001(十進制129)到11111110(十進制254),第二個字節范圍是0100 0000(十進制64)-01111110(十進制126)和1010 0001(十進制161)-11111110(十進制254)。Big5和GB18030,GBK,GB2312不兼容哈,如果已經理解了上文,其實你就能理解為什么Big5和GB的三個編碼為什么不兼容了。
編碼表匯總?
? ? ? 我們簡單匯總一下上面的內容。Ascii碼是基礎,一個字節表示,最高位設為O,其他7位表示128個字符。其他編碼都是兼容Ascii的,最高位使用1來進行區分。西歐主要使用Windows-1252,使用一個字節,增加了額外128個字符。中文大陸地區的三個主要編碼GB2312,GBK,GB18030,有時間先后關系,表示的字符數越來越多,且后面的兼容前面的,GB2312和GBK都是用兩個字節表示,而GB18030則使用兩個或四個字節表示。香港臺灣地區的主要編碼是Big5。
? ? ? ?如果文本里的字符都是Ascii碼字符,那么采用以上所說的任一編碼方式都是一樣的,不會亂碼。但如果有高位為1的字符,除了GB2312/GBK/GB18030外,其他編碼都是不兼容的,比如,Windows-1252和中文的各種編碼是不兼容的,即使Big5和GB18030都能表示繁體字,其表示方式也是不一樣的,而這就會出現所謂的亂碼。
亂碼和兼容
兼容: GB2312[GBK/GB18030 ASCII是兼容的比如我們文本里面a字符,使用這四種碼表任何一種都是可以正常顯示的。
windows-1252和ISO-8859-1和ASCII是兼容的
Big5和ASClI是兼容的
但是西歐編碼和Big5以及GB系列的編碼他們相互之間是不兼容的,也就是同樣的碼值在三種編碼表中顯示的內容是不一樣的。
?
八: Unicode
? ? ? ? 以上我們介紹了中文和西歐的字符與編碼,但世界上還有很多的國家的字符,每個國家的各種計算機廠商都對自己常用的字符進行編碼,在編碼的時候基本忽略了別的國家的字符和編碼,甚至忽略了同一國家的其他計算機 廠商,這樣造成的結果就是,出現了太多的編碼,且互相不兼容。
? ? ? ?問: 世界上所有的字符能不能統─編碼呢?可以,這就是Unicode。
Unicode做了一件事,就是給世界上所有字符都分配了一個唯一的數字編號,這個編號范圍從Qx000000到Ox10EFFEE,包括110多萬。但大部分常用字符都在0x0000到OXFFEE之間,即65536個數字之內。每個字符都有一個Unicode編號,這個編號一般寫成16進制,在前面加U+。大部分中文的編號范圍在U+4EO0到U+9FA5,例如,"賢"的Unicode是U+8D24。
? ? ? ?Unicode就做了這么一件事,就是給所有字符分配了唯一數字編號。它并沒有規定這個編號怎么對應到二進制表示,這是與上面介紹的其他編碼不同的,其他編碼都既規定了能表示哪些字符,又規定了每個字符對應的二進制是什么,而Unicode本身只規定了每個字符的數字編號是多少。
Unicode發展歷程:
? ? ? ? Unicode其實應該是一個碼值表。Unicode的作用是為每一個字符提供一個唯一的數字碼,而對數字碼的存儲規則的定義則需要依靠UTF-8/UTF-16/UTF-32,UTF-8/UTF-16/UTF-32是通過對Unicode碼值進行對應規則轉換后,編碼保持到內存/文件中。UTF-8/UTF-16都是可變長度的編碼方式。
那編號怎么對應到二進制表示呢? 有多種方案,主要有UTF-32,UTF-16和UTF-8。
?詳圖
?疑問: 為什么不直接把Unicode碼值直接存儲到內存當中?
答:? 因為Unicode表示范圍Qx000000到Ox10EFFEE表示的所有數要3個字節,但是3個字節太浪費了,很多字符表示起來根本不需要3個字符,所有太浪費資源了.計算機的內存資源是非常寶貴的.
后面的UTF-32/UTF-16/UTF-8詳解就請看:https://blog.csdn.net/m0_50370837/article/details/118862040
?
總結
以上是生活随笔為你收集整理的带你了解常见的编码表,以及他们自己的关系.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决 “数据大屏“ 展示的屏幕适配问题
- 下一篇: 大连富海计算机专修学校怎么样,大连富海计