Java中字符編碼格局詳解。本站提示廣大學習愛好者:(Java中字符編碼格局詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中字符編碼格局詳解正文
1、媒介
在剖析Comparable和Comparator的時刻,剖析到了String類的compareTo辦法,String底層是用char[]數組來寄存元素,在比擬的時刻是比擬的兩個字符串的字符,字符用char來存儲,此時,忽然想到,Java外面的char可以寄存中文嗎?後來發明是可以的,而且由此也引出了Java中字符的編碼格局成績。
2、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中,字符'張'是依照哪一種編碼格局停止存儲的呢?上面開端我們的剖析。
3、探秘思緒
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中也是兩個字節,故可以寄存。
4、總結
經由下面的剖析,我們曉得:
1. 字符在class文件中是以utf-8格局停止編碼的,而在JVM運轉時是采取utf-16格局停止編碼的。
2. char類型是兩個字節,可以用來寄存中文。
在此次挪用的進程中又查閱了很多多少關於字符方面的材料,收獲頗豐,而且發明特殊成心思,接上去會停止分享,所以特此預告下一篇將會進一步來引見編碼和編碼在Java中的成績。敬請等待