Codificar una cadena en UTF-8 en Java

1. Información general

Cuando se trata de String s en Java, a veces necesitamos codificarlos en un juego de caracteres específico.

Este tutorial es una guía práctica que muestra diferentes formas de codificar una cadena en el juego de caracteres UTF-8 ; Para obtener un análisis más profundo de los aspectos técnicos, consulte nuestra Guía de codificación de caracteres.

2. Definición del problema

Para mostrar la codificación de Java, trabajaremos con la cadena alemana "Entwickeln Sie mit Vergnügen".

String germanString = "Entwickeln Sie mit Vergnügen"; byte[] germanBytes = germanString.getBytes(); String asciiEncodedString = new String(germanBytes, StandardCharsets.US_ASCII); assertNotEquals(asciiEncodedString, germanString);

Esta cadena codificada con US_ASCII nos da el valor “Entwickeln Sie mit Vergn? Gen” cuando se imprime, porque no comprende el carácter ü no ASCII . Pero cuando convertimos una cadena codificada en ASCII que usa todos los caracteres en inglés a UTF-8, obtenemos la misma cadena.

String englishString = "Develop with pleasure"; byte[] englishBytes = englishString.getBytes(); String asciiEncondedEnglishString = new String(englishBytes, StandardCharsets.US_ASCII); assertEquals(asciiEncondedEnglishString, englishString);

Veamos qué sucede cuando usamos la codificación UTF-8.

3. Codificación con Core Java

Comencemos con la biblioteca principal.

Las cadenas son inmutables en Java, lo que significa que no podemos cambiar la codificación de caracteres de una cadena . Para lograr lo que queremos, necesitamos copiar los bytes de la Cadena y luego crear uno nuevo con la codificación deseada .

Primero, obtenemos los bytes de cadena y, después de eso, creamos uno nuevo usando los bytes recuperados y el juego de caracteres deseado:

String rawString = "Entwickeln Sie mit Vergnügen"; byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8); String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8); assertEquals(rawString, utf8EncodedString);

4. Codificación con Java 7 StandardCharsets

Alternativamente, podemos usar la clase StandardCharsets introducida en Java 7 para codificar el String .

Primero, decodificaremos la cadena en bytes y, en segundo lugar, codificaremos la cadena en UTF-8:

String rawString = "Entwickeln Sie mit Vergnügen"; ByteBuffer buffer = StandardCharsets.UTF_8.encode(rawString); String utf8EncodedString = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(rawString, utf8EncodedString);

5. Codificación con Commons-Codec

Además de usar el núcleo de Java, también podemos usar Apache Commons Codec para lograr los mismos resultados.

Apache Commons Codec es un paquete práctico que contiene codificadores y decodificadores simples para varios formatos.

Primero, comencemos con la configuración del proyecto. Cuando usamos Maven, tenemos que agregar la dependencia commons-codec a nuestro pom.xml :

 commons-codec commons-codec 1.14 

Entonces, en nuestro caso, la clase más interesante es StringUtils , que proporciona métodos para codificar String s. Con esta clase, obtener una cadena codificada en UTF-8 es bastante sencillo:

String rawString = "Entwickeln Sie mit Vergnügen"; byte[] bytes = StringUtils.getBytesUtf8(rawString); String utf8EncodedString = StringUtils.newStringUtf8(bytes); assertEquals(rawString, utf8EncodedString);

6. Conclusión

Codificar una cadena en UTF-8 no es difícil, pero no es tan intuitivo. Este tutorial presenta tres formas de hacerlo, ya sea usando el núcleo de Java o usando Apache Commons Codec.

Como siempre, los ejemplos de código se pueden encontrar en GitHub.