[英]Why is the first character in the CharBuffer returned by ByteBuffer::asCharBuffer always a space?
使用ByteBuffer时遇到以下行为。 对我来说这看起来像个错误,但也许我错误地使用了这些库。
码:
public static void main(String[] args) {
byte[] byteArray = "hello".getBytes(Charset.forName("UTF-16"));
CharBuffer buffer = ByteBuffer.wrap(byteArray).asCharBuffer();
System.out.println(buffer.length());
for (int i = 0; i < buffer.length(); i++) {
System.out.print(buffer.get(i));
}
}
输出:
6
hello
与领先空间有什么关系? 难道我做错了什么? 这是预期的行为吗? 如果是这样,为什么?
看起来您的系统使用UTF-8
作为默认字符集,而您需要使用UTF-16
解码hello
。 您可以查看:
System.out.println(System.getProperty("file.encoding")); // UTF-8 on my machine
由于您使用UTF-16
对其进行解码,因此您还应将其重新编码为具有UTF-16
CharBuffer
:
public static void main(String[] args) { byte[] byteArray = "hello".getBytes(Charset.forName("UTF-16")); ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray); Charset utf16 = Charset.forName("UTF-16"); CharBuffer buffer = utf16.decode(byteBuffer); System.out.println(buffer.length()); // 5 for (int i = 0; i < buffer.length(); i++) { System.out.print(buffer.get(i)); // hello }
}
如果您坚持原始代码,可以在其前面放置此代码片段,以确保系统将UTF-16
用作默认字符集:
System.out.println(System.setProperty("file.encoding", "UTF-16"));
这正是字节顺序标记 。
字节顺序标记(BOM)是一个Unicode字符,
U+FEFF
字节顺序标记(BOM),它在文本流开头的外观作为幻数可以向程序发出几个信号。
System.out.println(buffer.toString().startsWith("\uFEFF"));
System.out.println(buffer.length());
// let's remove BOM and check its length
System.out.println(buffer.toString().substring(1));
System.out.println(buffer.toString().substring(1).length());
特别记录了UTF-16编码以生成字节顺序标记。 如果您不想要BOM,则应指定UTF-16LE:
byte[] byteArray = "hello".getBytes(StandardCharsets.UTF_16LE);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.