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

consola:bytes desconocidos es devuelto por getBytes() método


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

¿Qué es?

[-2, -1] - ???

Además, me di cuenta, que si hago eso:


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

Consola:


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

Respuesta

5

El -2, -1 es una Marca de Orden de Byte (BOM - U + FEFF) que induce que el siguiente texto está codificado en formato UTF-16.

Probablemente esté obteniendo esto porque, aunque solo hay una codificación UTF8 y UTF32, hay dos codificaciones UTF16 UTF16LE y UTF16BE, donde los 2 bytes en el valor de 16 bits se almacenan en formato Big-Endian o Little Endian .

Como los valores que vuelven son 0xFE xFF, esto sugiere que la codificación es UTF16BE

2

El misterioso -2, -1 es un UTF-16 Byte Order Mark (BOM). Los otros valores negativos son simplemente bytes. En Java, el tipo byte está firmado, y oscila entre -128 y +127.

8

No olvide que los bytes no están firmados en Java. Así que -2, -1 realmente significa 0xfe 0xff ... y U + FEFF es el Unicode byte order mark (BOM) ... eso es lo que está viendo aquí en la versión UTF-16.

Para evitar obtener la lista de materiales al codificar, use UTF-16BE o UTF-16LE explícitamente. (También sugiero usar el names which are guaranteed by the platform en lugar de solo "utf8", etc. Es cierto que se garantiza que el nombre no se distingue entre mayúsculas y minúsculas, pero la falta de un guión lo hace menos confiable y no hay inconvenientes en el uso del nombre canónico.)

+0

1 por tener 238k rep. Debe saber de lo que está hablando. –

+0

@Erick Robertson, Jon Skeet es legen ... aguarde ... ¡dary! :) –

2

Un byte en java es un tipo con signo, por lo que es totalmente normal que tenga valores negativos.

Cuestiones relacionadas