歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java的char類型真的可以存漢字麼?

Java的char類型真的可以存漢字麼?

日期:2017/3/1 9:43:13   编辑:Linux編程

針對char類型存入漢字的進一步解析及一些編碼知識。疑問Java中的變量是否都是以Unicode編碼存儲的。

目錄
談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞
0、big endian和little endian
1、字符編碼、內碼,順帶介紹漢字編碼
2、Unicode、UCS和UTF
2.1、內碼和code page
3、UCS-2、UCS-4、BMP
4、UTF編碼
5、UTF的字節序和BOM
6、進一步的參考資料
附錄1 再說說區位碼、GB2312、內碼和代碼頁

今天偶爾看到一句話: ANSI編碼表示英文字符時用一個字節,表示中文用兩個字節,而unicode不管表示英文字符還是中文都是用兩個字節來表示。我突然間對自己之前對java變量以Unicode編碼存儲產生了疑問。

Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm

Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm

Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm

Java對象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm

到底是以Unicode編碼存儲的還是和源文件使用的編碼格式相同呢?

聯想到之前的一個問題java的char類型是否可以存儲漢字, 這個問題是有著肯定答案的:可以。 但是疑惑之余我還是做了個測試。

寫一個簡單的測試文件, 內容如下:

public class TestANSI{
public static void main(String[] args) {
char cc = '在';
System.out.println(cc);
}
}

以上文件以ANSI格式存儲。使用javac TestANSI.java編譯, java TestANSI運行可以看到輸出了漢字 在。

將以上文件復制一份, 修改為TestUTF8, 使用Notepad++轉為UTF8格式打開,再次編譯運行

javac -encoding utf8 TestUTF8.java

java TestUTF8

可以看到正確輸出了 漢字 在。

但是以上測試並不足以證明char型變量是以Unicode編碼存儲的。

我們在eclipse中編寫如下測試程序:

@Test
public void testChar() throws Exception {
char c = '從';
//UTF8: 20174 GBK:20174
System.out.println(String.valueOf(c).codePointAt(0));
}

將文件格式分別設置為UTF-8和GBK可以看到輸出的Unicode代碼點相同。

這說明char變量確實是以Unicode編碼存儲的, 我們再打開java api可以看到Character和String中大量篇幅都是在說明char和String是以UTF-16來存儲的。

以下是我從JDK7的源碼中摘出來的一句話:

Character information is based on the Unicode Standard, version 6.0.0.

JDK6中也有這麼一句, 只是版本號是4.0。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103044p2.htm

Copyright © Linux教程網 All Rights Reserved