Java中byte與漢字的關係

字節是二進制數據的單位。一個字節通常8位長。但是,一些老型號計算機結構使用不同的長度。爲了避免混亂,在大多數國際文獻中,使用詞代替byte。在多數的計算機系統中,一個字節是一個8位長的數據單位,大多數的計算機用一個字節表示一個字符、數字或其他字符。一個字節也可以表示一系列二進制位。在一些計算機系統中,4 個字節代表一個字,這是計算機在執行指令時能夠有效處理數據的單位。一些語言描述需要2個字節表示一個字符,這叫做雙字節字符集。一些處理器能夠處理雙字節或單字節指令。字節通常簡寫爲“B”,而位通常簡寫爲小寫“b”,計算機存儲器的大小通常用字節來表示

字節數組是由一系列字節組成。

提到漢字我們就會想起編碼,常用的編碼有GBKUTF8兩種,兩者的區別如下:

GBK編碼:是指中國的中文字符,其它它包含了簡體中文與繁體中文字符,另外還有一種字符“gb2312”,這種字符僅能存儲簡體中文字符。

UTF-8編碼:它是一種全國家通過的一種編碼,如果你的網站涉及到多個國家的語言,那麼建議你選擇UTF-8編碼。

UTF8編碼格式很強大,支持所有國家的語言,正是因爲它的強大,纔會導致它佔用的空間大小要比GBK大,對於網站打開速度而言,也是有一定影響的。GBK編碼格式,它的功能少,僅限於中文字符,當然它所佔用的空間大小會隨着它的功能而減少,打開網頁的速度比較快。

下面我來做實驗,先看如下代碼:

public static void main(String[] args)  {
	String str = "人";
	byte[] bs = str.getBytes();
	for(int i=0;i<bs.length;i++) {
		System.out.println(bs[i]);
	}
}

輸出結果如下:

-28
-70
-70

這個時候很多人看到這個結果就不淡定了,爲什麼會是這樣的結果,不是說一個漢字佔用2個字節嗎,怎麼成了三個了,不用着急,聽我慢慢道來:

首先我們先來看看我係統的編碼是什麼?

System.out.println(Charset.defaultCharset());

通過Charset類的方法可以獲取到你當前的項目環境編碼,我的電腦是UTF8。這個時候回到上面的問題上,爲什麼是3個,下面我們在來看一段代碼:

public static void main(String[] args) throws UnsupportedEncodingException {
	String str = "人";
	//使用UTF-8編碼
	byte[] bs = str.getBytes("UTF-8"); 
	for (int i = 0; i < bs.length; i++) {
		System.out.println(bs[i]);
	}
	
	System.out.println("==================");
	//使用GBK編碼
	byte[] bss = str.getBytes("GBK");
	for (int i = 0; i < bss.length; i++) {
		System.out.println(bss[i]);
	}
}

輸出的結果如下:

-28
-70
-70
==================
-56
-53

可以看到,GBK編碼確實比UTF-8少了一個字節。

有圖有真相,不騙你。

主要原因就是UTF-8本身包含的內容要比GBK多,所以在存儲的時候自然而然的多出了一個字節,雖然說GBK少,但是在大家做項目的時候還是建議使用UTF-8。

下面在來看一段有意思的代碼:

public static void main(String[] args) throws UnsupportedEncodingException {
	
	byte[] b = new byte[2];
	b[0] = -56;
	b[1] = -53;
	System.out.println(new String(b,"GBK"));
	
}

結果如下:

通過反向也是可以轉回去的,有興趣的夥伴們可以試試嘍。

有問題可以在下面評論,技術問題可以私信我。

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