Java中char佔多少字節

-

有些人可能很納悶,在看資料書的時候書上Java基礎數據類型章節中明明寫着char在Java中佔兩個字節,但是自己去實踐的時候卻發現英文字母只佔一個字節,而中文佔兩個字節???爲啥????

一、內碼與外碼

這裏涉及到兩個概念:內碼(internal encoding)和外碼(external encoding)
這個知乎回答裏有很好的解釋:https://www.zhihu.com/question/27562173/answer/37188642

所謂內碼,是一門語言實現char或String類型時在內存內部使用的編碼。
而Java是以UTF-16作爲內存的字符存儲格式的(《深入分析JavaWeb技術內幕》p64)
UTF-16是兩字節定長編碼的,幾乎可以翻譯世界上所有語言。因此Java內部內存中一個char是佔兩字節的,不論是英文還是中文。比如’a’和’你’都是佔兩字節的。

二、常用外碼

至於外碼,那是用於程序與外部交互時使用的編碼。在這個過程中就可能涉及到很多編解碼的操作。
常見編碼有:ASCII碼,UTF-8,GBK,GB2312,ISO-8859-1

在Java中讀取、寫入字符文件時可以指定字符編碼集的,若不指定則會使用系統默認編碼集。可以通過如下代碼來獲取系統默認編碼集:

String defaultCharsetName = Charset.defaultCharset().displayName();
System.out.println("defaultCharsetName:" + defaultCharsetName);//獲取默認編碼字符

不同編碼會導致字符編碼後(外碼)所佔字節數是不同的。常見的有:
utf-8編碼英文字符所佔字節數:1
utf-8編碼中文字符所佔字節數:3

GBK編碼英文字符所佔字節數:1
GBK編碼中文字符所佔字節數:2

byte[] data1 = "Hello我是生產者".getBytes("utf-8");  

上面這段代碼data1的length是:20 (5+5*3)
這是外碼環境中,我們所看得到的環境中。
如果你讀取的時候指定的是其他編碼集就有可能導致亂碼。
關於其他字符編程長度:https://www.zhihu.com/people/zhao-min-zm/activities

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章