一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中字符編碼格式詳解

Java中字符編碼格式詳解

2020-04-12 16:35leesf JAVA教程

在java應用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。本文主要給大家講解java中字符的編碼格式等相關問題

一、前言

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

二、Java存儲格式

  在Java中,如下代碼獲取了字符'張'的各種編碼格式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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"));
  }
}

  運行結果:

?
1
2
3
4
5
6
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文件常量池的存儲格式

  測試代碼如下  

?
1
2
3
4
5
public class Test {
 public static void main(String[] args) {
  String str = "張"
 }
}

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

Java中字符編碼格式詳解

  再使用winhex打開class文件,發現字符'張'在常量池的存儲如下

Java中字符編碼格式詳解

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

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

  2. 在程序中一探究竟

  使用如下代碼 

?
1
2
3
4
5
6
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中的問題。敬請期待

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: luan小说 | 69pao强力打造免费高速 | 日韩一区二区三区免费 | 亚洲好色网 | 久久视热频国产这里只有精品23 | 婷婷久久综合 | 91制片厂(果冻传媒)原档破解 | 公交车强校花系列小说 | 亚洲天堂影院在线观看 | 视频在线精品 | 午夜A级理论片左线播放 | 亚洲高清中文字幕一区二区三区 | 天天操精品视频 | 日本在线观看免费观看完整版 | 成人欧美一区在线视频在线观看 | 揉搓喷水h | 国产精品福利一区二区亚瑟 | 范冰冰上面好大下面好紧 | 欧美性bbbbbxxxxxddd | 国产精品99久久久 | 色悠久久久久综合欧美99 | 成人在线视频国产 | 加勒比一本大道香蕉在线视频 | 免费精品国产 | 201天天爱天天做 | 我和寂寞孕妇的性事 | 亚洲AV蜜桃永久无码精品红樱桃 | 久久re这里精品在线视频7 | 暖暖 免费 高清 日本 在线1 | 性欧美videofree中文字幕 | 大肥婆丰满大肥奶bbw肥 | 青草视频网 | 天天曰天天干 | 美女伊人网 | 日本一区二区视频免费播放 | 荡女人人爱 | 毛片免费全部免费观看 | 99久久精品自在自看国产 | 美女脱一净二净不带胸罩 | 王者荣耀瑶白色液体 | 国产精品美女久久久久网站 |