我想清理字符,字符序列根據字符集的表示形式,以及如何在Java中將字符集轉換爲另一個字符集。我有一些困難。字節緩衝區,字符緩衝區,字符串和字符集
例如,
ByteBuffer bybf = ByteBuffer.wrap("Olé".getBytes());
我的理解是:
- 字符串總是存儲在Java的UTF-16字節序列(每個字符2個字節,大端)
getBytes()
結果是這個UTF-16字節序列相同wrap()
保持這個序列 因此
bybf
是字符串的UTF-16大端表示Olé
因此,在該代碼:
decode()
應
- 解釋
bybf
作爲UTF-16串表示 - 將其「轉換」爲原始字符串
Olé
。
實際上沒有字節應該改變,因爲一切都是UTF-16存儲的,而UTF-16 Charset
應該是一種「中性運算符」。但結果打印爲:
??
這怎麼可能?
其他問題:對於正確地轉換,似乎Charset.decode(ByteBuffer bb)
要求bb
是一個串的UTF-16大端字節序列圖像。 這是正確的嗎?
編輯:從提供的答案,我做了一些測試,打印ByteBuffer
內容,並通過對其進行解碼獲得的chars
。字節[使用= "Olé".getBytes(charsetName)
]編碼打印在第一行組,其他行是通過解碼返回字節[用Charset#decode(ByteBuffer)
]與各種Charset
獲得的字符串。
我還確認在Windows 7計算機上將字符串存儲到byte[]
的默認編碼爲windows-1252
(除非字符串包含需要UTF-8的字符)。
Default VM encoding: windows-1252
Sample string: "Olé"
getBytes() no CS provided : 79 108 233 <-- default (windows-1252), 1 byte per char
Decoded as windows-1252: Olé <-- using the same CS than getBytes()
Decoded as UTF-16: ?? <-- using another CS (doesn't work indeed)
getBytes with windows-1252: 79 108 233 <-- same than getBytes()
Decoded as windows-1252: Olé
getBytes with UTF-8: 79 108 195 169 <-- 'é' in UTF-8 use 2 bytes
Decoded as UTF-8: Olé
getBytes with UTF-16: 254 255 0 79 0 108 0 233 <-- each char uses 2 bytes with UTF-16
Decoded as UTF-16: Olé (254-255 is an encoding tag)
大多數Windows系統都不會默認使用utf-8。還不確定「UTF-16 ish」是什麼意思。 java使用UTF-16。 – jtahlborn
感謝BevynQ。我目前正在學習Java,你的演示對我來說非常有用。 – mins
@jtahlborn:我的默認CS是windows-1252,直到我將示例字符串更改爲「I♥café」。添加心臟使Java切換到UTF-8。很有教育意義。 – mins