Hay varias formas de convertir una matriz de bytes en una cadena de caracteres en Java, pero la forma más sencilla es utilizar el constructor String que acepta una matriz de bytes, es decir, new String(byte ), pero la clave para recordar es la codificación de caracteres. Dado que los bytes son datos binarios pero las cadenas son datos de caracteres, es muy importante conocer la codificación de caracteres original del texto a partir del cual se ha creado la matriz de bytes. Si utilizas una codificación de caracteres diferente, no obtendrás el String original. Por ejemplo, si has leído la matriz de bytes de un archivo que estaba codificado en «ISO-8859-1» y no has proporcionado ninguna codificación de caracteres al convertir la matriz de bytes a String utilizando el constructor new String(), entonces no está garantizado que obtengas el mismo texto de nuevo. ¿Por qué? porque new String() por defecto utiliza la codificación por defecto de la plataforma (por ejemplo, la máquina Linux donde se ejecuta su JVM), que podría ser diferente de «ISO-8859-1».
Si es diferente puede ver algunos caracteres basura o incluso diferentes caracteres que cambian el significado del texto por completo y no estoy diciendo esto por la lectura de algunos libros, pero me he enfrentado a este problema en uno de mi proyecto en el que estamos leyendo los datos de la base de datos que contiene algunos caracteres franceses.
En ausencia de cualquier codificación especificada, nuestra plataforma por defecto en algo que no es capaz de convertir todos los caracteres especiales correctamente, no recuerdo la codificación exacta. Ese problema se resolvió proporcionando «UTF-8» como codificación de caracteres al convertir la matriz de bytes a String. Sí, hay otro constructor sobrecargado en la clase String que acepta la codificación de caracteres, es decir, new String(byte, «character encoding»).
Si eres nuevo en el mundo de la codificación de caracteres y no entiendes lo que es UTF-8 o UTF-16, te recomiendo que leas mi artículo diferencia entre codificación UTF-8, UTF-16, y UTF-32. Eso no sólo explicará la diferencia, sino que también le dará una idea básica sobre la codificación de caracteres.
Otro artículo que le recomiendo leer es sobre cómo Java trata la codificación de caracteres por defecto. Dado que muchas clases que realizan la conversión entre bytes y caracteres almacenan en caché la codificación de caracteres, es importante aprender a proporcionar la codificación adecuada a nivel de la JVM. Si esto te interesa entonces aquí está el enlace al artículo completo.
Cómo convertir un array de bytes a String en Java
Todo es 0 y 1 en el mundo de los ordenadores, sin embargo somos capaces de ver diferentes cosas, por ejemplo, texto, imágenes, archivos de música, etc. La clave para convertir una matriz de bytes en una cadena es la codificación de caracteres. En pocas palabras, los valores de los bytes son valores numéricos y la codificación de caracteres es un mapa que proporciona un carácter para un byte en particular.
Por ejemplo, en la mayoría de los esquemas de codificación de caracteres, por ejemplo, UTF-8, si el valor del byte es 65, el carácter es A, para 66 es B. Dado que los caracteres ASCII, que incluyen números, alfabetos y algunos caracteres especiales, son muy populares, tienen el mismo valor en la mayoría de los esquemas de codificación. Pero eso no es cierto para cada valor de byte, por ejemplo -10 puede ser diferente en UTF-8 y el esquema de codificación de Windows-1252.
También puede leer Core Java Volumen 1 – Fundamentos o Core Java para impacientes por Cay S. Horstmann para aprender más sobre la conversión de bytes a caracteres en Java. El segundo libro también cubre Java SE 8, uno de los libros más actualizados del mercado en este momento.
Ahora alguien puede cuestionar que, dado que el byte tiene 8 bits, sólo puede representar un máximo de 255 caracteres, que es bastante menos dado tantos lenguajes en el mundo. Por eso tenemos esquemas de codificación de caracteres multibyte, que pueden representar muchos caracteres. ¿Por qué necesitamos convertir bytes en cadenas? Un ejemplo del mundo real es mostrar datos codificados en base 64 como texto. Para ello, es necesario convertir la matriz de bytes a String hexadecimal como se muestra en ese tutorial.
Ejemplo de Matriz de Bytes a String en Java
Ahora que sabemos el poco de teoría sobre cómo convertir la matriz de bytes a String, vamos a ver un ejemplo de trabajo. Para que el ejemplo sea sencillo, he creado una matriz de bytes en el propio programa y luego he convertido esa matriz de bytes en String utilizando diferentes codificaciones de caracteres, por ejemplo, cp1252, que es la codificación de caracteres por defecto en Eclipse, windows1252 otra codificación popular en Windows y UTF-8, que es una codificación de caracteres estándar por defecto en el mundo. Si ejecuta este programa y mira la salida, se dará cuenta de que la mayoría de los caracteres son los mismos en las tres codificaciones, son en su mayoría caracteres ASCII que contienen alfabetos en mayúsculas y minúsculas y números, pero los caracteres especiales se representan de manera diferente. Aquí es donde el uso de una codificación de caracteres incorrecta puede crear problemas. El resto del ejemplo es bastante sencillo, ya que tenemos una matriz de bytes y sólo estamos utilizando el constructor String sobrecargado que también acepta la codificación. Para un ejemplo más complejo, en el que leemos el contenido de un archivo XML, vea este tutorial. También hay caracteres imprimibles y no imprimibles en ASCII, que se maneja de manera diferente por diferentes codificación de caracteres.
importar java.io.UnsupportedEncodingException;public class ByteArrayToStringDemo { public static void main(String args) throws UnsupportedEncodingException { byte random = new byte { 67, 65, 70, 69, 66, 65, 66, 69, -20}; String utf = new String(random, "UTF-8"); String cp1252 = new String(random, "Cp1252"); String windows1252 = new String(random, "Windows-1252"); System.out.println("Cadena creada a partir de una matriz de bytes en codificación UTF-8 : " + utf); System.out.println("Cadena creada a partir de una matriz de bytes en codificación Cp1252 : " + cp1252); System.out.println("Cadena creada a partir de una matriz de bytes en codificación Windows-1252 : " + windows1252); }}Output :Cadena creada a partir de una matriz de bytes en codificación UTF-8 : CAFEBABE?matriz de bytes a cadena en la codificación Cp1252 : CAFEBABEìmatriz de bytes a cadena en la codificación Windows-1252 : CAFEBABEì
Eso es todo acerca de cómo convertir matriz de bytes a cadena en Java. Siempre proporcionar la codificación de caracteres, mientras que la conversión de bytes al carácter y que debe ser la misma codificación que se utiliza en el texto original. Si no lo sabes, UTF-8 es una buena opción por defecto, pero no confíes en la codificación de caracteres por defecto de la plataforma porque está sujeta a cambios y puede que no sea UTF-8. Una mejor opción es establecer la codificación de caracteres para su aplicación en el nivel de la JVM para tener un control completo sobre cómo la matriz de bytes se convierte en cadena.
Aprendizaje adicional
Estructuras de datos y algoritmos: Inmersión profunda con Java
Fundamentos de Java: El Lenguaje Java
Masterclass completa de Java
0 comentarios