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]
答案 0 :(得分:8)
不要忘记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 :(得分:5)
-2,-1是字节顺序标记(BOM-U + FEFF),表示以下文本以UTF-16格式编码。
你可能得到这个,因为虽然只有一个UTF8和UTF32编码,但有两个UTF16编码UTF16LE和UTF16BE,其中16位值中的2个字节以Big-Endian或Little Endian格式存储。
由于返回的值为0xFE xFF,这表明编码为UTF16BE
答案 2 :(得分:2)
神秘的-2, -1
是UTF-16 Byte Order Mark (BOM)。其他负值只是字节。在Java中,byte
类型已签名,范围从-128
到+127
。
答案 3 :(得分:2)
java中的一个字节是带符号的类型,因此它具有负值是完全正常的。