Encoder une chaîne en UTF-8 en Java

1. Vue d'ensemble

Lorsque nous traitons des chaînes en Java, nous devons parfois les encoder dans un jeu de caractères spécifique.

Ce tutoriel est un guide pratique montrant différentes manières d'encoder une chaîne dans le jeu de caractères UTF-8 ; pour une plongée plus technique, consultez notre guide sur l'encodage des caractères.

2. Définition du problème

Pour présenter l'encodage Java, nous travaillerons avec la chaîne allemande «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);

Cette chaîne encodée avec US_ASCII nous donne la valeur «Entwickeln Sie mit Vergn? Gen» lorsqu'elle est imprimée, car elle ne comprend pas le caractère non ASCII ü . Mais lorsque nous convertissons une chaîne encodée en ASCII qui utilise tous les caractères anglais en UTF-8, nous obtenons la même chaîne.

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

Voyons ce qui se passe lorsque nous utilisons l'encodage UTF-8.

3. Encodage avec Core Java

Commençons par la bibliothèque principale.

Les chaînes sont immuables en Java, ce qui signifie que nous ne pouvons pas modifier le codage des caractères String . Pour réaliser ce que nous voulons, nous devons copier les octets de la chaîne , puis en créer une nouvelle avec l'encodage souhaité .

Tout d'abord, nous obtenons les octets de chaîne et, après cela, en créons un nouveau en utilisant les octets récupérés et le jeu de caractères souhaité:

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. Codage avec Java 7 StandardCharsets

Alternativement, nous pouvons utiliser la classe StandardCharsets introduite dans Java 7 pour encoder la chaîne .

Tout d'abord, nous allons décoder la chaîne en octets et, deuxièmement, encoder la chaîne 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. Encodage avec Commons-Codec

En plus d'utiliser le noyau Java, nous pouvons également utiliser Apache Commons Codec pour obtenir les mêmes résultats.

Apache Commons Codec est un package pratique contenant des encodeurs et des décodeurs simples pour différents formats.

Commençons par la configuration du projet. Lors de l'utilisation de Maven, nous devons ajouter la dépendance commons-codec à notre pom.xml :

 commons-codec commons-codec 1.14 

Ensuite, dans notre cas, la classe la plus intéressante est StringUtils , qui fournit des méthodes pour encoder les String s. En utilisant cette classe, obtenir une chaîne encodée en UTF-8 est assez simple:

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

6. Conclusion

Encoder une chaîne en UTF-8 n'est pas difficile, mais ce n'est pas si intuitif. Ce didacticiel présente trois façons de le faire, soit en utilisant le noyau Java, soit en utilisant Apache Commons Codec.

Comme toujours, les exemples de code peuvent être trouvés sur GitHub.