繁体   English   中英

为什么ByteBuffer :: asCharBuffer返回的CharBuffer中的第一个字符总是一个空格?

[英]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);

它与Java源文件的编码有关。 使您的源文件UTF-16编码,您将看不到此行为。 由于它是一个字符串文字,它应该以相同的编码存在于代码中,您要求它在getBytes调用中对其进行解码。

例如,Eclipse默认使用源代码的非UTF-16编码,因为源代码中的字符串文字“hello”不是UTF-16,并且我得到了与您相同的结果(另外一个垃圾字符)在开始)。 但是,将文件编码更改为UTF-16会产生预期的结果。 (文件 - >属性 - >资源 - >文本文件编码)

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM