java的char類型,只有兩個字節,為什么可以存儲漢字?java中 char詳解


我自己出了一道面試題,如下:

    public static void main(String[] args) {
        char a = '9';
        char b = 9;
        char c = '我';
        System.out.println(Integer.valueOf(c));//輸出為 25105
    }
請根據本頁面右側編碼資料(ASCII碼),回答以上Java代碼【運行】后,a,b,c 依次在內存中 如何 存儲的?

 

 

這道題就是考察之前說的字節與字符,這道題若知道原理的可以快速 利用 asc碼和計算器,迅速得出答案。

A: java 是 unicode ,通常我們說 UTF-16 就是 unicode ,但是經過我的測試 UTF-16 又分:UTF-16BE     和 UTF-16LE 兩種,java 采用的是 UTF-16BE; 既然是unicode 中文肯定可以存了。

C: 這項中文故意放了3個字節,通常人都會犯UTF-8的錯誤,我認為.java文件你可以保存為UTF-8編碼的,編譯成中間文件 .class 你也可以編譯成UTF-8編碼的,但是程序運行時就是以unicode為准,即運行時,char a = 'a'就是在內存中 占用2個字節。

D:原因同a

 

 

 

 

 

 

 

這篇文章與我猜想的一致,已經很充分的說明了問題:https://www.cnblogs.com/louiswong/p/6062417.html

.java .class 保存時 可以保存為 utf-8編碼,但是運行時一定是 unicode編碼。

    pom.xml里的 如下配置都是指外碼。
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> .java 的外碼 編碼 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 日志的外碼 編碼 <maven.compiler.encoding>UTF-8</maven.compiler.encoding> .class 的外碼 編碼

 

 -----------------------------------------------------------------------------------

在討論這個問題之前,我們需要先區分unicode和UTF。

  1. unicode :統一的字符編號,僅僅提供字符與編號間映射。符號數量在不斷增加,已超百萬。詳細:[https://zh.wikipedia.org/zh-cn/Unicode]
  2. UTF :unicode轉換格式 (unicode transformation format) 。定義unicode中編號的編碼方式。utf8和utf16便是其中兩種實現方式。其中utf8為變長表示,長度可能時1~6個字節;utf16為變長表示,長度可能是2或4個字節。詳細:UTF8 [https://zh.wikipedia.org/zh-cn/UTF-8] UTF16 [https://zh.wikipedia.org/zh-cn/UTF-16]

接着,要分清內碼(internal encoding)和外碼(external encoding)。

  1. 內碼 :某種語言運行時,其char和string在內存中的編碼方式。
  2. 外碼 :除了內碼,皆是外碼。

要注意的是,源代碼編譯產生的目標代碼文件(可執行文件或class文件)中的編碼方式屬於外碼。

先看一下內碼
JVM中內碼采用UTF16。早期,UTF16采用固定長度2字節的方式編碼,兩個字節可以表示65536種符號(其實真正能表示要比這個少),足以表示當時unicode中所有字符。但是隨着unicode中字符的增加,2個字節無法表示所有的字符,UTF16采用了2字節或4字節的方式來完成編碼。Java為應對這種情況,考慮到向前兼容的要求,Java用一對char來表示那些需要4字節的字符。所以,java中的char是占用兩個字節,只不過有些字符需要兩個char來表示。
詳細:
[https://docs.oracle.com/javase/tutorial/i18n/text/unicode.html]
[http://www.zhihu.com/question/27562173]

外碼
Java的class文件采用UTF8來存儲字符,也就是說,class中字符占1~6個字節。
Java序列化時,字符也采用UTF8編碼,占1~6個字符。

總結:

  1. java中內碼(運行內存)中的char使用UTF16的方式編碼,一個char占用兩個字節,但是某些字符需要兩個char來表示。所以,一個字符會占用2個或4個字節。
  2. java中外碼中char使用UTF8的方式編碼,一個字符占用1~6個字節。
  3. UTF16編碼中,英文字符占兩個字節;絕大多數漢字(尤其是常用漢字)占用兩個字節,個別漢字(在后期加入unicode編碼的漢字,一般是極少用到的生僻字)占用四個字節。
  4. UTF8編碼中,英文字符占用一個字節;絕大多數漢字占用三個字節,個別漢字占用四個字節。

EOF

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM