char型別在C或C++中佔1個位元組,在java中佔2個位元組。char用於C或C++中是定義字元型變數的,而char資料型別是一種整數型別,只會佔據1個位元組。而在java中char型別佔2個位元組是因為Java編譯器預設使用Unicode編碼,因此2位元組(16位元)可以表示所有字元。
本教學操作環境:windows7系統、Dell G3電腦。
我百度搜尋「char佔幾個位元組」,得到下面的答案:
char用於C或C++中定義字元型變數,是一種整數型別,只佔一個位元組,取值範圍為 -128 ~ +127(-27~27-1)。
char型別佔1位元組,就是8位元,所能儲存的正整數是 0111 1111,即127。
顯然這不是我們想要的結果,於是我繼續搜尋「java中的char佔幾個位元組」
Java中的char用於存放字元的資料型別,佔用2個位元組,採用unicode編碼,它的前128位元組編碼與ASCII相容,只不過有些字元需要兩個char來表示。
為什麼C或C++和java中的char佔用位元組數不相同?
有些字元需要兩個char來表示又是什麼意思?
編碼
在討論這個問題之前,我們先對部分知識點做一下普及。
首先我們都知道計算機中儲存的資訊都是用二進位制數表示的,那怎麼樣讓計算機儲存我們人類用的漢字或英文呢?
比如如何將'a'轉換為二進位制儲存到計算機中,稱為編碼;
而將儲存在計算機中的二進位制數解析顯示出來,稱為解碼。
字元集
字元(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數位等。字元集(Character set)是多個字元的集合,字元集種類較多,每個字元集包含的字元個數不同,常見字元集名稱:ASCII字元集、GB2312字元集、BIG5字元集、 GB18030字元集、Unicode字元集等。這是百度百科給的解釋,反正就是字元集是一些字元的集合,字元集種類多,字元集中的字元數量也各不相同。計算機要準確的處理各種字元集文字,需要進行字元編碼,以便計算機能夠識別和儲存各種文字。
unicode
它的名字叫統一碼, 也叫萬國碼,符號數量在不斷增加,已超百萬 。
在創造Unicode之前,有數百種編碼系統。沒有一個編碼可以包含足夠的字元,從它的名字就可以看出這是一種所有符號的編碼,每一個符號都給予一個獨一無二的編碼,那麼各個不同編碼導致的亂碼問題就會消失。
大多數計算機採用ASCII碼(美國標準資訊交換碼),它是表示所有大小寫字母、數位、標點符號和控制字元的7位編碼方案。統一碼(Unicode)包含ASCII碼,'\u0000'到'\u007F'對應全部128個ACSII字元。
不禁讓我感慨,有實力的人才能制定標準。 Unicode 只是一個符號集,它只規定了符號的二進位制程式碼,僅僅提供字元與編號間對映,卻沒有規定這個二進位制程式碼應該如何儲存。 我們知道英文字母的編號特別小,用一個位元組就完全能夠表示,而unicode中的中文符號的編號就很大了,一個位元組根本不行。 於是後面出現了unicode字元儲存的多種實現方式,比如UTF-8,UTF-16等。 UTF-8 是在網際網路上使用最廣的一種 Unicode 的實現方式。
內碼和外碼
我們常說的java中的char佔幾個位元組,應該是java中內碼中的char。
內碼是指java執行時,其char和string在記憶體中的編碼方式;外碼是程式與外部互動時外部使用的字元編碼,比如序列化技術。 外碼可以理解為:只要不是內碼,那就是外碼。 要注意的是,原始碼編譯產生的目的碼檔案(可執行檔案或class檔案)中的編碼方式屬於外碼。 JVM中內碼採用UTF16。 UTF-16 的 16 指的就是最小為 16 位一個單元,也即兩位元組為一個單元。早期,UTF16採用固定長度2位元組的方式編碼,兩個位元組可以表示65536種符號(其實真正能表示要比這個少),足以表示當時unicode中所有字元。但是隨著unicode中字元的增加,2個位元組無法表示所有的字元,UTF16採用了2位元組或4位元組的方式來完成編碼。Java為應對這種情況,考慮到向前相容的要求,Java用一對char來表示那些需要4位元組的字元。所以,java中的char是佔用兩個位元組,只不過有些字元需要兩個char來表示。 這裡就解釋了為什麼有些字元需要兩個char來表示的問題。
另外:Java的class檔案採用UTF8來儲存字元,也就是說,class中字元佔1~6個位元組。 Java序列化時,字元也採用UTF8編碼,佔1~6個字元。
length()
那再來一個問題:Java中的一個字元的String.length()是多少?
看過前面的知識點不能再張嘴就來回答是1吧...... 寫個demo看一下:虎年就用虎來測試吧,tigerUTF對對應unicode編碼表示。
String tiger = "?";
String tigerUTF = "\uD83D\uDC05";
System.out.println(tigerUTF);
System.out.println(tiger.length());
System.out.println(tiger.codePointCount(0,tiger.length()));
登入後複製
可以得出呼叫String.length()
得到的結果為2,表示的是stirng的char陣列佔UTF-16格式的2個程式碼單元(即4個位元組),而不是有多少個字元。 當然我們想要獲取多少個字元,可以使用codePointCount
方法來獲取。
更多相關知識,請存取欄目!
以上就是char型別要佔幾個位元組的詳細內容,更多請關注TW511.COM其它相關文章!