2010-11-16 15 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:byte sconosciuti restituito da getBytes() metodo


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

cosa si tratta?

[-2, -1] - ???

Inoltre, ho notato, che se lo faccio:


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] 

risposta

5

Il -2, -1 è un segno di ordine byte (BOM - U + FEFF) che indica che il seguente testo è codificato in formato UTF-16.

Probabilmente stai ottenendo questo perché, mentre c'è solo una codifica UTF8 e UTF32, ci sono due codifiche UTF16 UTF16LE e UTF16BE, dove i 2 byte nel valore di 16 bit sono memorizzati nel formato Big-Endian o Little Endian .

Poiché i valori che ritornano sono 0xFE xFF, questo suggerisce che la codifica è UTF16BE

2

Il misterioso -2, -1 è un UTF-16 Byte Order Mark (BOM). Gli altri valori negativi sono semplicemente byte. In Java, il tipo byte è firmato e varia da -128 a +127.

8

Non dimenticare che i byte non sono firmati in Java. Quindi -2, -1 significa veramente 0xfe 0xff ... e U + FEFF è l'Unicode byte order mark (BOM) ... è quello che vedi qui nella versione UTF-16.

Per evitare di ottenere il BOM durante la codifica, utilizzare UTF-16BE o UTF-16LE in modo esplicito. (Vorrei anche suggerire di usare lo names which are guaranteed by the platform anziché solo "utf8" ecc. Certo il nome è garantito che viene trovato senza distinzione tra maiuscole e minuscole, ma la mancanza di un trattino lo rende meno affidabile e non ci sono aspetti negativi nell'usare il nome canonico.)

+0

+1 per avere 238k rep. Devi sapere di cosa stai parlando. –

+0

@ Eric Robertson, Jon Skeet è lego .... aspettalo .... dario! :) –

2

Un byte in java è un tipo firmato, quindi è del tutto normale che abbia valori negativi.

Problemi correlati