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

Console:unbekanntes Bytes wird durch die Methode getBytes zurückgegeben()


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

Was ist das?

[-2, -1] - ???

Auch habe ich festgestellt, dass, wenn ich das tun:


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

Console:


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

Antwort

5

Die -2, -1 ist eine Byte Order Mark (BOM - U + FEFF), die angibt, dass der folgende Text im UTF-16-Format codiert ist.

Wahrscheinlich erhalten Sie dies, da es zwar nur eine UTF8- und UTF32-Codierung gibt, jedoch zwei UTF16-Kodierungen UTF16LE und UTF16BE, wobei die 2 Bytes im 16-Bit-Wert im Big-Endian- oder Little-Endian-Format gespeichert werden .

Da die Werte, die kommen, sind wieder 0xFE xFF, legt dies nahe, dass die Codierung Utf16BE ist

2

Der mysteriöse -2, -1 ist ein UTF-16 Byte Order Mark (BOM). Die anderen negativen Werte sind einfach Bytes. In Java ist der byte Typ signiert und reicht von -128 bis +127.

8

Vergessen Sie nicht, dass Bytes in Java vorzeichenlos sind. Also -2, -1 bedeutet wirklich 0xfe 0xff ... und U + FEFF ist der Unicode byte order mark (BOM) ... das ist, was Sie hier in der UTF-16-Version sehen.

Um zu vermeiden, dass die Stückliste beim Codieren verwendet wird, verwenden Sie explizit UTF-16BE oder UTF-16LE. (Ich würde auch vorschlagen, die names which are guaranteed by the platform statt nur "utf8" usw. zu verwenden. Zugegebenermaßen ist der Name garantiert fallunabhängig zu finden, aber das Fehlen eines Bindestrichs macht ihn weniger zuverlässig, und es gibt keine Nachteile bei der Verwendung des kanonischen Namens.)

+0

+1 für 238K rep aufweist. Du musst wissen wovon du sprichst. –

+0

@Erick Robertson, Jon Skeet ist legen .... warten Sie darauf .... Dary! :) –

2

Ein Byte in Java ist ein signierter Typ, daher ist es völlig normal, dass es negative Werte hat.

Verwandte Themen