Java默認編碼Unicode和ASCII、UTF-8等的區別


  • Java文件編譯成Class文件,是由Java編譯器處理的,windows上是javac.exe,生成的文件編碼是Unicode編碼。
  • Class文件加載到JVM的時候,就是JVM讀取Class文件的時候是以Unicode編碼讀取的。

Java中默認的編碼方式是Unicode !

在學習字節流和字符流的時候,突然發現自己對字符集編碼不是很了解,所以特意學習一發,總結ASCII,Unicode,UTF-8的對比。

開始:ASCII編碼

  • 計算機內部以二進制位(bit)作為基礎數據,所以就有0和1兩種狀態。
  • 八個二進制位(bit)為一個字節(byte),可以組合出256種狀態,每一個狀態對應一個符號共256個符號,從0000000到11111111。

因此在上個世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關系,做了統一規定。這被稱為ASCII碼,一直沿用至今。

ASCII碼一共規定了128個字符的編碼,比如空格"SPACE"是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節的后面7位,最前面的1位統一規定為0。

混亂:非ASCII編碼

因為英語128個符號就可以了,但是其他國家是遠遠不夠的,語言系統完全不一樣。所以他們各自都很聰明,利用字節中閑置的最高位編入新的符號。比如,法語中的é的編碼為130(二進制10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號。

編碼很混亂

各個國家自己擴展了自己語言系統的編碼,於是全球出現無數種亂七八糟的編碼。比如說下中國:

  1. 等中國人們得到計算機時,已經沒有可以利用的字節狀態來表示漢字,況且有6000多個常用漢字需要保存呢。於是國人就自主研發出“GB2312″,GB2312 是對 ASCII 的中文擴展。
  2. 但是中國的漢字太多了,后來還是不夠用,於是擴展之后的編碼方案被稱為 GBK 標准,GBK 包括了 GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。
  3. 后來少數民族也要用電腦了,於是我們再擴展,又加了幾千個新的少數民族的字,GBK 擴成了 GB18030。從此之后,中華民族的文化就可以在計算機時代中傳承了。

統一:Unicode編碼

  1. 一個叫 ISO (國際標誰化組織)的國際組織決定着手解決這個問題。
  2. 采用的方法很簡單:廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號的編碼!
  3. 他們打算叫它”Universal Multiple-Octet Coded Character Set”,簡稱 UCS, 俗稱 “UNICODE”。

但是呢,Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。所以實際上這個Unicode只是一個字符的協議文檔,具體的實現是由各自實現的,所以衍生出UTF-8,UTF-16,UTF-32。

  • UTF-8:就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。
  • UTF-16:字符用兩個字節或四個字節表示
  • UTF-32:字符用四個字節表示

注意:

(1) utf-8 中漢字占三個字節。

(2) Java中,char型變量是用來存儲Unicode編碼的字符的。

總結一下,他們的關系如圖:


 
image.png


作者:taojian
鏈接:https://www.jianshu.com/p/483b79197852
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM