我想清理字符,字符序列根据字符集的表示形式,以及如何在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