2010-11-16 23 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(); 
    } 
} 
} 

konsoli:nieznany bajty są zwracane przez getBytes() metoda


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

Co to jest?

[-2, -1] - ???

Również zauważyłem, że jeśli to zrobić:


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"))); 

konsoli:


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

Odpowiedz

5

-2, -1 jest znacznikiem kolejności bajtów (BOM - U + FEFF), który wskazuje, że poniższy tekst jest zakodowany w formacie UTF-16.

Prawdopodobnie otrzymujesz to, ponieważ podczas gdy istnieje tylko jedno kodowanie UTF8 i UTF32, istnieją dwa kodowania UTF16 UTF16LE i UTF16BE, gdzie 2 bajty w 16-bitowej wartości są przechowywane w formacie Big-Endian lub Little Endian .

jako wartości, które pochodzą z powrotem są 0xfe xff, sugeruje to, że kodowanie jest UTF16BE

2

Tajemnicza -2, -1 jest UTF-16 Byte Order Mark (BOM). Pozostałe wartości ujemne to po prostu bajty. W języku Java podpisywana jest nazwa byte i jest w zakresie od -128 do +127.

8

Nie zapominaj, że bajty są unsigned w Javie. Więc -2, -1 naprawdę oznacza 0xfe 0xff ... a U + FEFF to Unicode byte order mark (BOM) ... to jest to, co widzisz tutaj w wersji UTF-16.

Aby uniknąć uzyskania BOM podczas kodowania, należy jawnie używać UTF-16BE lub UTF-16LE. (Sugerowałbym także użycie nazwy names which are guaranteed by the platform, a nie tylko "utf8" itd. Oczywiście nazwa jest niewidoczna bez względu na wielkość liter, ale brak łącznika powoduje, że jest mniej niezawodny i nie ma wad w używaniu nazwy kanonicznej.)

+0

+1 za posiadanie 238k rep. Musisz wiedzieć, o czym mówisz. –

+0

@Erick Robertson, Jon Skeet jest legen .... czekaj na to .... dary! :) –

2

Bajt w java jest typu podpisanego, więc jest całkowicie normalne, że ma wartości ujemne.

Powiązane problemy