針對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