架構師必須掌握的各種編碼:ASCII、ISO-8859-1、GB2312

茅坤寶駿氹發表於2018-05-05

轉載自 架構師必須掌握的各種編碼:ASCII、ISO-8859-1、GB2312

編碼在我們日常開發過程中經常有遇到,常見的編碼格式有ASCII、ISO-8859-1、GB2312、GBK、GB18030、UNICODE、UTF-8、UTF-16等,其中GB2312、GBK、GB18030、UTF-8、UTF-16都可以用來表示中文,那麼哪種儲存中文會比較合適呢,下面會對這幾種編碼一一介紹便會有結論。


為什麼有編碼


我們知道計算機中最小的儲存單位是位元組(byte),一個位元組所能表示的字元數又有限,1byte=8bit,一個位元組最多也只能表示255個字元,而世界上的語種又多,都有各種不同的字元,無法用一個byte表示,所以java中的char表示字元就是來解決這種編碼問題的,一個char佔兩個位元組,所以從char到最小單位byte之間必須經過編碼。



常用編碼


ASCII


全稱為American Standard Code for Information Interchange,美國資訊交換標準程式碼,這是世界上最通用的單位元組編碼系統,主要用來顯示現代英語及其他西歐語言。


ASCII碼用7位表示,只能表示128個字元,0~31表示控制字元如回車、退格、刪除等;32~126表示列印字元即可以通過鍵盤輸入並且能顯示出來的字元,

其中48~57為0到9十個阿拉伯數字,65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其餘為一些標點符號、運算子號等,具體可以參考ASCII標準表。


ISO-8859-1


既然ASCII只能表示128個字元,顯示是不能完全表示完的,所以ISO-8859-1擴充套件了ASCII編碼,在ASCII編碼之上又增加了西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字元號,它是向下相容ASCII編碼的。


ISO-8859-1也是單位元組編碼,但它是一個8位的容器,它能表示256個字元。


GB2312


全稱為資訊交換用漢字編碼字符集,是中國於1980年釋出,主要用於計算機系統中的漢字處理。GB2312主要收錄了6763個漢字、682個符號。


GB2312覆蓋了漢字的大部分使用率,但不能處理像古漢語等特殊的罕用字,所以後來出現了像GBK、GB18030這種編碼。


GBK


GBK,全稱為Chinese Internal Code Specification,即漢字內碼擴充套件規範,於1995年制定。它主要是擴充套件了GB2312,在它的基礎上又加了更多的漢字,它一共收錄了21003個漢字。


GBK是向下相容GB2312編碼的,也就是說GB2312編碼的漢字可以用GBK正常解碼不會出現亂碼,但用GBK編碼的漢字用GB2312解碼就不一定了。


GB18030


GB18030全稱漢字內碼擴充套件規範,是現在最新的內碼字集於2000年釋出,並於2001年強制執行,包含了中國大部分少數民族的語言字元,收錄漢字數超過70000餘個。


它主要採用單位元組、雙位元組、四位元組對字元編碼,它是向下相容GB2312和GBK的,雖然是我國的強制使用標準,但在實際生產中很少用到,用得最多的反而是GBK和GB2312。



UNICODE


為了自己的語言能在計算機中正常顯示,每個國家和地區都有各自的編碼,所以編碼多了誰也不認識對方的編碼,這時候ISO組織就提出了一種新的編碼叫UNICODE編碼讓全球的文化、字元、符號都能支援。UNICODE在制定時計算機容量已不是問題,所以設計成了固定兩個位元組,所有的字元都用16位表示,包括之前只佔8位的英文字元等,所以會造成空間的浪費,UNICODE在很長的一段時間內都沒有得到推廣應用。


UTF-16


UTF-16是UNICODE的具體實現,16即16位,UTF-16即是這個來由,定義了UNICODE字元在計算機中的儲存方式,UTF-16同樣使用了兩個位元組來表示任何字元,這樣使得操作字串非常高效,這也是java把UTF-16作為字元在記憶體中儲存的格式的重要原因。


UTF-16適合在磁碟與記憶體之間使用,字元和位元組的相互轉換會更加簡單和高效,但不適合在網路上傳輸,因為網路傳輸可能會損壞位元組流。


UTF-8


雖然UTF-16很高效,但也是UNICODE最大的壞處,使得所有單位元組字元一定要佔兩個位元組,儲存空間放大了一倍,這明顯消耗了資源,不符合現在網際網路高速發展的現狀。所以有了UTF-8,它是UNICODE的一種可變長度字元編碼的實現,它可以使用1~6個定長位元組來編碼UNICODE字元。


UTF-8對ASCII字元使用單位元組儲存,單個字元損壞也不會影響後面的字元,所以UTF-8非常適合在網路上面傳統,也是現在使用最廣泛的編碼之一。


如果要表示中文,UTF-8編碼效率要大於GBK,小於UTF-16,所以它也是除了GBK之外最理想的編碼方式。


編碼在我們日常開發過程中經常有遇到,常見的編碼格式有ASCII、ISO-8859-1、GB2312、GBK、GB18030、UNICODE、UTF-8、UTF-16等,其中GB2312、GBK、GB18030、UTF-8、UTF-16都可以用來表示中文,那麼哪種儲存中文會比較合適呢,下面會對這幾種編碼一一介紹便會有結論。


為什麼有編碼


我們知道計算機中最小的儲存單位是位元組(byte),一個位元組所能表示的字元數又有限,1byte=8bit,一個位元組最多也只能表示255個字元,而世界上的語種又多,都有各種不同的字元,無法用一個byte表示,所以java中的char表示字元就是來解決這種編碼問題的,一個char佔兩個位元組,所以從char到最小單位byte之間必須經過編碼。



常用編碼


ASCII


全稱為American Standard Code for Information Interchange,美國資訊交換標準程式碼,這是世界上最通用的單位元組編碼系統,主要用來顯示現代英語及其他西歐語言。


ASCII碼用7位表示,只能表示128個字元,0~31表示控制字元如回車、退格、刪除等;32~126表示列印字元即可以通過鍵盤輸入並且能顯示出來的字元,

其中48~57為0到9十個阿拉伯數字,65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其餘為一些標點符號、運算子號等,具體可以參考ASCII標準表。


ISO-8859-1


既然ASCII只能表示128個字元,顯示是不能完全表示完的,所以ISO-8859-1擴充套件了ASCII編碼,在ASCII編碼之上又增加了西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字元號,它是向下相容ASCII編碼的。


ISO-8859-1也是單位元組編碼,但它是一個8位的容器,它能表示256個字元。


GB2312


全稱為資訊交換用漢字編碼字符集,是中國於1980年釋出,主要用於計算機系統中的漢字處理。GB2312主要收錄了6763個漢字、682個符號。


GB2312覆蓋了漢字的大部分使用率,但不能處理像古漢語等特殊的罕用字,所以後來出現了像GBK、GB18030這種編碼。


GBK


GBK,全稱為Chinese Internal Code Specification,即漢字內碼擴充套件規範,於1995年制定。它主要是擴充套件了GB2312,在它的基礎上又加了更多的漢字,它一共收錄了21003個漢字。


GBK是向下相容GB2312編碼的,也就是說GB2312編碼的漢字可以用GBK正常解碼不會出現亂碼,但用GBK編碼的漢字用GB2312解碼就不一定了。


GB18030


GB18030全稱漢字內碼擴充套件規範,是現在最新的內碼字集於2000年釋出,並於2001年強制執行,包含了中國大部分少數民族的語言字元,收錄漢字數超過70000餘個。


它主要採用單位元組、雙位元組、四位元組對字元編碼,它是向下相容GB2312和GBK的,雖然是我國的強制使用標準,但在實際生產中很少用到,用得最多的反而是GBK和GB2312。



UNICODE


為了自己的語言能在計算機中正常顯示,每個國家和地區都有各自的編碼,所以編碼多了誰也不認識對方的編碼,這時候ISO組織就提出了一種新的編碼叫UNICODE編碼讓全球的文化、字元、符號都能支援。UNICODE在制定時計算機容量已不是問題,所以設計成了固定兩個位元組,所有的字元都用16位表示,包括之前只佔8位的英文字元等,所以會造成空間的浪費,UNICODE在很長的一段時間內都沒有得到推廣應用。


UTF-16


UTF-16是UNICODE的具體實現,16即16位,UTF-16即是這個來由,定義了UNICODE字元在計算機中的儲存方式,UTF-16同樣使用了兩個位元組來表示任何字元,這樣使得操作字串非常高效,這也是java把UTF-16作為字元在記憶體中儲存的格式的重要原因。


UTF-16適合在磁碟與記憶體之間使用,字元和位元組的相互轉換會更加簡單和高效,但不適合在網路上傳輸,因為網路傳輸可能會損壞位元組流。


UTF-8


雖然UTF-16很高效,但也是UNICODE最大的壞處,使得所有單位元組字元一定要佔兩個位元組,儲存空間放大了一倍,這明顯消耗了資源,不符合現在網際網路高速發展的現狀。所以有了UTF-8,它是UNICODE的一種可變長度字元編碼的實現,它可以使用1~6個定長位元組來編碼UNICODE字元。


UTF-8對ASCII字元使用單位元組儲存,單個字元損壞也不會影響後面的字元,所以UTF-8非常適合在網路上面傳統,也是現在使用最廣泛的編碼之一。


如果要表示中文,UTF-8編碼效率要大於GBK,小於UTF-16,所以它也是除了GBK之外最理想的編碼方式。

相關文章