【字元編碼】Java編碼格式探秘

來源:互聯網
上載者:User

標籤:unicode   ted   jvm   buffer   out   檔案中   exce   分享   tle   

一、前言

  在分析Comparable和Comparator的時候,分析到了String類的compareTo方法,String底層是用char[]數組來存放元素,在比較的時候是比較的兩個字串的字元,字元用char來儲存,此時,突然想到,Java裡面的char可以存放中文嗎?後來發現是可以的,並且由此也引出了Java中字元的編碼格式問題。

二、Java儲存格式

  在Java中,如下代碼擷取了字元‘張‘的各種編碼格式。

import java.io.UnsupportedEncodingException;public class Test {    public static String getCode(String content, String format) throws UnsupportedEncodingException {        byte[] bytes = content.getBytes(format);        StringBuffer sb = new StringBuffer();        for (int i = 0; i < bytes.length; i++) {            sb.append(Integer.toHexString(bytes[i] & 0xff).toUpperCase() + " ");        }                return sb.toString();    }    public static void main(String[] args) throws UnsupportedEncodingException {        System.out.println("gbk : " + getCode("張", "gbk"));        System.out.println("gb2312 : " + getCode("張", "gb2312"));        System.out.println("iso-8859-1 : " + getCode("張", "iso-8859-1"));        System.out.println("unicode : " + getCode("張", "unicode"));
    System.out.println("utf-16 : " + getCode("張", "utf-16")); System.out.println("utf-8 : " + getCode("張", "utf-8"));  }}

  運行結果:

gbk : D5 C5 gb2312 : D5 C5 iso-8859-1 : 3F unicode : FE FF 5F 20 utf-16 : FE FF 5F 20 utf-8 : E5 BC A0 

  說明:從結果我們可以知道,字元‘張‘的gbk與gb2312編碼是相同的,unicode與utf-16編碼時相同的,但是其iso-8859-1、unicode、utf-8編碼都是不相同的,至於各個編碼的含義,我們這裡不給出解釋,下一篇會給出答案。那麼,在JVM中,字元‘張‘是按照哪種編碼格式進行儲存的呢?下面開始我們的分析。

三、探秘思路

 1. 查看.class檔案常量池的儲存格式

  測試代碼如下  

public class Test {    public static void main(String[] args) {        String str = "張";            }}

  使用javap -verbose Test.class進行反編譯,發現常量池情況如下:

  再使用winhex開啟class檔案,發現字元‘張‘在常量池的儲存如下

  說明:上面兩張可以在class檔案中是以utf-8的格式儲存的。

  但是在運行時是否是utf-8格式呢?繼續我們的探秘之旅。

  2. 在程式中一探究竟

  使用如下代碼 

public class Test {        public static void main(String[] args) {        String str = "張";        System.out.println(Integer.toHexString(str.codePointAt(0)).toUpperCase());    }}

  運行結果:

  5F20

  說明:根據結果我們知道在運行時JVM是使用的utf-16格式進行儲存,utf-16一般是使用2個位元組進行儲存,如果遇到兩個位元組無法表示的字元則會使用4個位元組表示。之後會另外有篇幅進行介紹,並且我們查看Character類源碼時,會發現就是使用的utf-16進行編碼的,從兩面都找到了我們想要的答案。

  3. char類型可以存放中文嗎?

  根據上面的探索我們已經知道了Java的class檔案中字元是以utf-8進行編碼的,在JVM運行時則是以utf-16進行編碼儲存的。而字元‘張‘可以用兩個位元組來表示,而char在Java中也是兩個位元組,故可以存放。

四、總結

  經過上面的分析,我們知道:

  1. 字元在class檔案中是以utf-8格式進行編碼的,而在JVM運行時是採用utf-16格式進行編碼的。

  2. char類型是兩個位元組,可以用來存放中文。

  在此次調用的過程中又查閱了好多關於字元方面的資料,受益匪淺,並且發現特別有意思,接下來會進行分享,所以特此預告下一篇將會進一步來介紹編碼以及編碼在Java中的問題。敬請期待,也謝謝各位園友的觀看~

 

 

【字元編碼】Java編碼格式探秘

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.