java如何將中文轉換成byte數組

作爲一名程序員,有時候會在想,java是如何將一箇中文字符,轉化成一個byte數組,是如果從一個byte數組轉化成字符的呢? 其實大家都知道utf-8英文佔1個字節,中文佔3個字節,GBK中文英文都佔2個字節,但是我想問,比如utf-8,有誰知道一箇中文字符是如何在java中轉換成一個byte數組的?

好了,下面進入我們的正題:

例如;中 這個字是如何轉換成一個byte數組的?

String str = "中";
byte [] bs = str.getBytes("UTF-8");

首先,任意一個字符都定義在統一的unicode編碼表中,unicode有65535個字符,幾乎包含了所有的語言。所以‘中’在unicode中的編碼爲\u4E2D對應10進製爲20013.
然後看下utf-8計算byte數組的算法:
var4[0] = (byte)(224 | var8 >> 12);
var4[1] = (byte)(128 | var8 >> 6 & 63);
var4[2] = (byte)(128 | var8 & 63);

第0個數組 20013>> 12 結果再和224進行或運算
20013二進制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
向右移動12位: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
224的二進制: 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
| 運算結果爲: 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0
11100100的十進制爲: -28

第1個數組 20013>> 6 結果再和63與運算 再和128或運算
20013二進制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
向右移動12位: 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0
63的二進制: 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
& 運算結果爲: 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0
128的二進制爲: 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
| 運算結果爲: 10111000
十進制爲: -72

第2個數組 20013& 63 再和128或運算
20013二進制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
63的二進制: 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
& 運算結果爲: 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1
128的二進制爲: 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
| 運算結果爲: 10101101
十進制爲: -83

這樣3個byte數組的數字分別是 -28 -72 -83 ,大家可以通過java運行來檢驗下結果是否正確, 其實第0位數組算的是16位字節中的前4位,第1位數組放的5-10位字節,第2位數組放的是11-16位的字節,既 4+6+6 = 16 byte數組按照這種方式切分。
那麼下面問大家一個問題:
第0位數組爲什麼要和224或運算?
第1位數組爲什麼要和128或運算?
第2位數組爲什麼要和128或運算?
有知道答案的大家可以在下方留言

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