眾所周知,JAVA為了國際通用,用的是UNICODE來保存里面的字符。而UNICODE只是一個種字符集,字符的存儲和表示要用到一定的字符編碼格式,而與UNICODE對應的字符編碼格式就是我們常看到的UTF-8,UTF-16等等,而UTF-8是最常用的,所以人們常常把它和UNICODE等同起來,這在某些情況下是沒有錯的,但這樣的理解在JAVA里就會產生一些混淆。我們用下面的程序來演示一下。
定義一個字符串
String name = "堂";
這個字符串就一個字符,把它取出來
char c_name = name.charAt(0);
JAVA里的char型是十六位的(兩個字節),但是如果是用UTF-8的話可能會不只兩位(UTF-8是變長存儲的),那看來JAVA本身并不是用UTF-8來保存的,口說無憑,做個實驗吧。
首先看看char里保存的內容
int low = (c_name) & 0xff;//取c_name的低位 int high = (c_name >> 8) & 0xff;//取c_name的高位 System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low)); |
只有兩個字節而已(16位),那么真正的UTF-8編碼的內容是什么呢,再看看吧。
為了方便,我寫了一個輔助方法printbyte,作用是把一個byte數組的每個元素按照十六進制格式打印出來,同樣為了方便,我把它作為靜態方法。
public static void printbyte(byte[] bt)
|
結果是e5 a0 82 length = 3
哇,三個字節!看來JAVA內部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知。
byte[] utf_16 = name.getBytes("utf-16"); printbyte(utf_16); |
byte[] utf_16be = name.getBytes("utf-16be"); printbyte(utf_16be); 結果出來了:58 02 length = 2 |
附上全代碼:
































