我想清理字符,字符序列根据字符集的表示形式,以及如何在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
Decoded as windows-1252: Olé
Decoded as UTF-16: ??
getBytes with windows-1252: 79 108 233
Decoded as windows-1252: Olé
getBytes with UTF-8: 79 108 195 169
Decoded as UTF-8: Olé
getBytes with UTF-16: 254 255 0 79 0 108 0 233
Decoded as UTF-16: Olé (254-255 is an encoding tag)
2014-06-29
mins