Conversión de matriz de bytes a String (Java)

Estoy escribiendo una aplicación web en el motor de la aplicación de Google. Permite a las personas editar básicamente el código html que se almacena como un archivo .html en el blobstore.

Estoy usando fetchData para devolver un byte[] de todos los caracteres en el archivo. Intento imprimir en un html para que el usuario edite el código html. ¡Todo funciona genial!

Aquí está mi único problema ahora:

La matriz de bytes está teniendo algunos problemas al convertir de nuevo a una cadena. Las citas inteligentes y un par de personajes salen luciendo funky. (? o símbolos japoneses, etc.) Específicamente, veo varios bytes que tienen valores negativos que están causando el problema.

Las citas inteligentes vuelven como -108 y -109 en la matriz de bytes. ¿Por qué es esto y cómo puedo decodificar los bytes negativos para mostrar la encoding de caracteres correcta?

La matriz de bytes contiene caracteres en una encoding especial (que debe saber). La forma de convertirlo a String es:

 String decoded = new String(bytes, "UTF-8"); // example for one encoding type 

Por cierto: los bytes sin formato pueden aparecer como decimales negativos solo porque el byte tipo de datos Java está firmado, cubre el rango de -128 a 127.


 -109 = 0x93: Control Code "Set Transmit State" 

El valor (-109) es un carácter de control no imprimible en UNICODE. Entonces UTF-8 no es la encoding correcta para esa secuencia de caracteres.

0x93 en “Windows-1252” es la “cita inteligente” que está buscando, por lo que el nombre de Java de esa encoding es “Cp1252”. La siguiente línea proporciona un código de prueba:

 System.out.println(new String(new byte[]{-109}, "Cp1252")); 

A partir de Java 7 , también puede pasar su encoding deseada al constructor de String como una constante de Charset desde StandardCharsets .

Esto puede ser más seguro que pasar la encoding como una String , como se sugiere en las otras respuestas, y debe hacerlo de esta manera si está utilizando Java 7 o superior.

Ejemplo para la encoding UTF-8

 String bytesAsString = new String(bytes, StandardCharsets.UTF_8); 

Puedes probar esto.

 String s = new String(bytearray); 
 public class Main { /** * Example method for converting a byte to a String. */ public void convertByteToString() { byte b = 65; //Using the static toString method of the Byte class System.out.println(Byte.toString(b)); //Using simple concatenation with an empty String System.out.println(b + ""); //Creating a byte array and passing it to the String constructor System.out.println(new String(new byte[] {b})); } /** * @param args the command line arguments */ public static void main(String[] args) { new Main().convertByteToString(); } } 

Salida

 65 65 A 
 public static String readFile(String fn) throws IOException { File f = new File(fn); byte[] buffer = new byte[(int)f.length()]; FileInputStream is = new FileInputStream(fn); is.read(buffer); is.close(); return new String(buffer, "UTF-8"); // use desired encoding } 

Sugiero Arrays.toString(byte_array);

Depende de tu propósito. Por ejemplo, quería guardar una matriz de bytes exactamente igual que el formato que puede ver en el momento de la depuración que es algo como esto: [1, 2, 3] Si desea guardar exactamente el mismo valor sin convertir los bytes a formato de caracteres, Arrays.toString (byte_array) hace esto ,. Pero si quiere guardar caracteres en lugar de bytes, debe usar String s = new String(byte_array) . En este caso, s es igual al equivalente de [1, 2, 3] en el formato del personaje.

La respuesta anterior de Andreas_D es buena. Voy a agregar que siempre que muestre la salida habrá una fuente y una encoding de caracteres, y es posible que no admita algunos caracteres.

Para saber si es Java o su pantalla lo que es un problema, haga esto:

  for(int i=0;i 

Java mapeará cualquier carácter que no pueda entender para definir el carácter oficial de caracteres desconocidos. Si ve un '?' en la salida, pero no está asignado a 0xfffd, es la fuente de visualización o la encoding el problema, no Java.