【问题标题】:unknown bytes is returned by method getBytes()方法 getBytes() 返回未知字节
【发布时间】:2011-05-10 20:11:26
【问题描述】:


import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Main {
 public static void main(String[] args)
 {
  try 
  {
   String s = "s";
   System.out.println( Arrays.toString( s.getBytes("utf8") ) );
   System.out.println( Arrays.toString( s.getBytes("utf16") ) );
   System.out.println( Arrays.toString( s.getBytes("utf32") ) );
  }  
  catch (UnsupportedEncodingException e) 
  {
   e.printStackTrace();
  }
 }
}

控制台:


[115]
[-2, -1, 0, 115]
[0, 0, 0, 115]

这是什么?

[-2, -1] - ???

另外,我注意到,如果我这样做:


String s = new String(new char[]{'\u1251'});
System.out.println( Arrays.toString( s.getBytes("utf8") ) );
System.out.println( Arrays.toString( s.getBytes("utf16") ) );
System.out.println( Arrays.toString( s.getBytes("utf32") ) );

控制台:


[-31, -119, -111]
[-2, -1, 18, 81]
[0, 0, 18, 81]

【问题讨论】:

    标签: java string unicode


    【解决方案1】:

    -2、-1 是字节顺序标记 (BOM - U+FEFF),表示以下文本以 UTF-16 格式编码。

    您可能会得到这个,因为虽然只有一种 UTF8 和 UTF32 编码,但有两种 UTF16 编码 UTF16LE 和 UTF16BE,其中 16 位值中的 2 个字节以 Big-Endian 或 Little Endian 格式存储。

    由于返回的值是0xFE xFF,这表明编码是UTF16BE

    【讨论】:

      【解决方案2】:

      java中的字节是有符号类型,所以它有负值是完全正常的。

      【讨论】:

        【解决方案3】:

        不要忘记在 Java 中字节是无符号的。所以 -2, -1 真的意味着 0xfe 0xff... 而 U+FEFF 是 Unicode byte order mark (BOM)... 这就是您在 UTF-16 版本中看到的内容。

        为避免在编码时获取 BOM,请明确使用 UTF-16BE 或 UTF-16LE。 (我还建议使用names which are guaranteed by the platform 而不仅仅是“utf8”等。诚然,可以保证不区分大小写地找到该名称,但是缺少连字符会使其可靠性降低,并且使用规范没有缺点名字。)

        【讨论】:

        • +1 代表拥有 238k 代表。你必须知道你在说什么。
        【解决方案4】:

        神秘的-2, -1 是一个UTF-16 Byte Order Mark (BOM)。其他负值只是字节。在 Java 中,byte 类型是有符号的,范围从 -128+127

        【讨论】:

          猜你喜欢
          • 2021-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多