方法getBytes()返回未知字节

mr.*_*sky 5 java string unicode



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();
  }
 }
}

Run Code Online (Sandbox Code Playgroud)

安慰:


[115]
[-2, -1, 0, 115]
[0, 0, 0, 115]
Run Code Online (Sandbox Code Playgroud)

它是什么?

[-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") ) );
Run Code Online (Sandbox Code Playgroud)

安慰:


[-31, -119, -111]
[-2, -1, 18, 81]
[0, 0, 18, 81]
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

不要忘记Java中的字节是无符号的.所以-2,-1实际上意味着0xfe 0xff ...而U + FEFF是Unicode 字节顺序标记(BOM)......这就是你在UTF-16版本中看到的内容.

为避免在编码时获取BOM,请明确使用UTF-16BE或UTF-16LE.(我还建议使用平台保证名称,而不仅仅是"utf8"等.不可否认,该名称保证不会出现大小写,但缺少连字符会使其不太可靠,并且没有缺点使用规范名称.)


Sim*_*lan 5

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

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

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