文本處理中常常有這樣的邏輯:java
String s = new String(bts, "UTF-8");編碼
看String源代碼,裏面是一個char[],將bts按照某種編碼方式,變成了char[],不經有個疑問:spa
使用UTF-8,UTF-16,ASIIC 等encode出來的char是相同的麼?char是byte按照什麼編碼方式生成的呢?code
簡單的辦法,是看java序列化的實現方式,char最後是怎麼序列化到byte[]中去的.unicode
ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeChar('A');it
看writeChar的內部實現io
public void writeChar(int val) throws IOException {bout.writeChar(val);} 序列化
追到底層實現方法
調用了BlockDataOutputStream.writeChar方法,在看這個方法的內部實現static
public void writeChar(int v) throws IOException {if (pos + 2 <= MAX_BLOCK_SIZE) {Bits.putChar(buf, pos, (char) v);pos += 2;} else {dout.writeChar(v);}}
最終使用了Bits.putChar方法
static void putChar(byte[] b, int off, char val) {b[off + 1] = (byte) (val );b[off ] = (byte) (val >>> 8);}
好吧,看到這裏就清楚了,用的是UTF-16BE(和UTF-16,UTF-16lE 不同)大端序編碼方式。
回到最初的問題上
String s = new String(bts, "UTF-8");
這行代碼的含義是什麼呢?
是將bts按照UTF-8編碼的方式獲取到unicode的pointcode (就是unicode定義字符的序號),而後再將這個pointcode按照utf-16be的方式編碼成char. //最終的實現方式,可能有差別,可是結果是沒錯滴^^