java編碼相關 – JAVA編程語言程序開發技術文章

寫在前面:

  1:“字節”是byte,“位”是bit ;

  2: 1 byte = 8 bit ;

  char 在java中是2個字節。java采用unicode,2個字節(16位)來表示一個字符。

  ANSI碼(American National Standards Institute),中文:美國國傢標準學會的標準碼。

不同的國傢和地區制定瞭不同的標準,由此產生瞭GB2312, BIG5, JIS 等各自的編碼標準。這些使用2 個字節來代表一個字符的各種漢字延伸編碼方式,稱為ANSI 編碼。在簡體中文系統下,ANSI 編碼代表GB2312 編碼,在日文操作系統下,ANSI 編碼代表JIS 編碼。不同ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段ANSI 編碼的文本中。 當然對於ANSI編碼而言,0x00~0x7F之間的字符,依舊是1個字節代表1個字符。這一點是ASNI編碼與Unicode編碼之間最大也最明顯的區別。比如“A君是第131號”,在ANSI編碼中,占用12個字節,而在Unicode(UTF-16)編碼中,占用16個字節。因為A和1、3、1這4個字符,在ANSI編碼中隻各占1個字節,而在Unicode(UTF-16)編碼中,是需要各占2個字節的。

       
  char x = '我';

  String str = "我";

  byte[] bytes = str.getBytes(); //我想不明白,為什麼這裡要占用3個byte呢? 3個byte一共是3*8=24位;

  那麼char x 怎麼又放得下?因為char是16位的啊??

  原因:

  byte[] bytes = str.getBytes();之後是3個字節,這裡和前面的概念不一樣。

  java是用unicode來表示字符,"我"這個中文字符的unicode就是2個字節。String.getBytes(encoding)方法是獲取指定編碼的byte數組表示,通常gbk/gb2312是2個字節,utf-8是3個字節。如果不指定encoding則取系統默認的encoding。

 

        由於JDK是國際版的,在編譯的時候,如果我們沒有用-encoding參數指定我們的JAVA源程序的編碼格式,則javac.exe首先獲得我們操作系統默認采用的編碼格式,也即在編譯java程序時,若我們不指定源程序文件的編碼格式,JDK首先獲得操作系統的file.encoding參數(它保存的就是操作系統默認的編碼格式,如WIN2k,它的值為GBK),然後JDK就把我們的java源程序從file.encoding編碼格式轉化為JAVA內部默認的UNICODE格式放入內存中。然後,javac把轉換後的unicode格式的文件進行編譯成.class類文件,此時.class文件是UNICODE編碼的,它暫放在內存中,緊接著,JDK將此以UNICODE編碼的編譯後的class文件保存到我們的操作系統中形成我們見到的.class文件。對我們來說,我們最終獲得的.class文件是內容以UNICODE編碼格式保存的類文件,它內部包含我們源程序中的中文字符串,隻不過此時它己經由file.encoding格式轉化為UNICODE格式瞭。當我們不加設置就編譯時,相當於使用瞭參數:javac -encoding gbk XX.java,當然就會出現不兼容的情況。

摘自 shijinupc的專欄

發佈留言