java中Char究竟是什麼格式的編碼

 

文本處理中常常有這樣的邏輯: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. //最終的實現方式,可能有差別,可是結果是沒錯滴^^

相關文章
相關標籤/搜索