2010-11-16 8 views
5


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

консоли:неизвестных байт возвращается методом GetBytes()


[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] 

ответ

5

-2, -1 - знак байтового заказа (BOM - U + FEFF), который заключает, что следующий текст кодируется в формате UTF-16.

Возможно, вы получаете это, потому что, хотя есть только одно кодирование UTF8 и UTF32, существуют два кодировки UTF16 и UTF16BE UTF16, где 2 байта в 16-битном значении хранятся в формате Big-Endian или Little Endian ,

По мере того как значения, которые возвращаются в 0xfe XFF, это говорит о том, что кодирование UTF16BE

2

Таинственная -2, -1 является UTF-16 Byte Order Mark (BOM). Другими отрицательными значениями являются просто байты. В Java тип byte подписан и находится в диапазоне от -128 до +127.

8

Не забывайте, что байты без знака в Java. Итак, -2, -1 действительно означает 0xfe 0xff ... и U + FEFF является Unicode byte order mark (BOM) ... вот что вы видите здесь в версии UTF-16.

Чтобы избежать получения спецификации при кодировании, используйте UTF-16BE или UTF-16LE явно. (Я бы также предложил использовать names which are guaranteed by the platform, а не только «utf8» и т. Д. По общему признанию, имя гарантируется, что оно будет нечувствительным к регистру, но отсутствие дефиса делает его менее надежным, и нет недостатков в использовании канонического имени.)

+0

+1 за то, что 238k репутацию. Вы должны знать, о чем говорите. –

+0

@ Эрик Робертсон, Джон Скит - легенда .... ждут этого .... dary! :) –

2

Байт в java является подписанным типом, поэтому для него вполне нормальные значения.

Смежные вопросы