程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中字符編碼格局詳解

Java中字符編碼格局詳解

編輯:關於JAVA

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中的成績。敬請等待

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved