国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java中字符編碼格式詳解

2019-11-26 14:29:03
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、前言

  在分析Comparable和Comparator的時(shí)候,分析到了String類的compareTo方法,String底層是用char[]數(shù)組來(lái)存放元素,在比較的時(shí)候是比較的兩個(gè)字符串的字符,字符用char來(lái)存儲(chǔ),此時(shí),突然想到,Java里面的char可以存放中文嗎?后來(lái)發(fā)現(xiàn)是可以的,并且由此也引出了Java中字符的編碼格式問(wèn)題。

二、Java存儲(chǔ)格式

  在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"));  }}

  運(yùn)行結(jié)果:

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 

  說(shuō)明:從結(jié)果我們可以知道,字符'張'的gbk與gb2312編碼是相同的,unicode與utf-16編碼時(shí)相同的,但是其iso-8859-1、unicode、utf-8編碼都是不相同的。那么,在JVM中,字符'張'是按照哪種編碼格式進(jìn)行存儲(chǔ)的呢?下面開始我們的分析。

三、探秘思路

 1. 查看.class文件常量池的存儲(chǔ)格式

  測(cè)試代碼如下  

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

  使用javap -verbose Test.class進(jìn)行反編譯,發(fā)現(xiàn)常量池情況如下:

  再使用winhex打開class文件,發(fā)現(xiàn)字符'張'在常量池的存儲(chǔ)如下

  說(shuō)明:上面兩張可以在class文件中是以u(píng)tf-8的格式存儲(chǔ)的。

  但是在運(yùn)行時(shí)是否是utf-8格式呢?繼續(xù)我們的探秘之旅。

  2. 在程序中一探究竟

  使用如下代碼 

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

  運(yùn)行結(jié)果:

5F20

  說(shuō)明:根據(jù)結(jié)果我們知道在運(yùn)行時(shí)JVM是使用的utf-16格式進(jìn)行存儲(chǔ),utf-16一般是使用2個(gè)字節(jié)進(jìn)行存儲(chǔ),如果遇到兩個(gè)字節(jié)無(wú)法表示的字符則會(huì)使用4個(gè)字節(jié)表示。之后會(huì)另外有篇幅進(jìn)行介紹,并且我們查看Character類源碼時(shí),會(huì)發(fā)現(xiàn)就是使用的utf-16進(jìn)行編碼的,從兩面都找到了我們想要的答案。

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

  根據(jù)上面的探索我們已經(jīng)知道了Java的class文件中字符是以u(píng)tf-8進(jìn)行編碼的,在JVM運(yùn)行時(shí)則是以u(píng)tf-16進(jìn)行編碼存儲(chǔ)的。而字符'張'可以用兩個(gè)字節(jié)來(lái)表示,而char在Java中也是兩個(gè)字節(jié),故可以存放。

四、總結(jié)

  經(jīng)過(guò)上面的分析,我們知道:

  1. 字符在class文件中是以u(píng)tf-8格式進(jìn)行編碼的,而在JVM運(yùn)行時(shí)是采用utf-16格式進(jìn)行編碼的。

  2. char類型是兩個(gè)字節(jié),可以用來(lái)存放中文。

  在此次調(diào)用的過(guò)程中又查閱了好多關(guān)于字符方面的資料,受益匪淺,并且發(fā)現(xiàn)特別有意思,接下來(lái)會(huì)進(jìn)行分享,所以特此預(yù)告下一篇將會(huì)進(jìn)一步來(lái)介紹編碼以及編碼在Java中的問(wèn)題。敬請(qǐng)期待

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泗洪县| 礼泉县| 高安市| 顺义区| 东乡族自治县| 东丽区| 台江县| 崇义县| 绥滨县| 青岛市| 睢宁县| 厦门市| 驻马店市| 醴陵市| 济宁市| 临沂市| 手机| 灵川县| 丹东市| 桂阳县| 酒泉市| 高碑店市| 慈利县| 屏边| 巴彦县| 上栗县| 阳信县| 桐梓县| 新野县| 缙云县| 宿迁市| 澎湖县| 朔州市| 简阳市| 靖安县| 信宜市| 丹巴县| 临沭县| 文安县| 庄河市| 汽车|