91 votes

Comment convertir une chaîne avec un encodage Unicode en une chaîne de lettres

J'ai une chaîne avec des caractères Unicode échappés, \uXXXX, et je veux les convertir en lettres Unicode normales. Par exemple :

"\u0048\u0065\u006C\u006C\u006F World"

doit devenir

"Hello World"

Je sais que lorsque j'imprime la première chaîne, elle affiche déjà Hello world. Mon problème est que je lis les noms de fichiers à partir d'un fichier, puis je les recherche. Les noms de fichiers dans le fichier sont échappés avec un encodage Unicode, et lorsque je les recherche, je ne peux pas les trouver, car il recherche un fichier avec \uXXXX dans son nom.

6voto

StringEscapeUtils de la bibliothèque org.apache.commons.lang3 est déprécié depuis la version 3.6.

Vous pouvez donc utiliser leur nouvelle bibliothèque commons-text à la place :

compile 'org.apache.commons:commons-text:1.9'

OU

   org.apache.commons
   commons-text
   1.9

Exemple de code :

org.apache.commons.text.StringEscapeUtils.unescapeJava(escapedString);

4voto

QuantumMechanic Points 7825

Il n'est pas totalement clair d'après votre question, mais je suppose que vous dites que vous avez un fichier où chaque ligne de ce fichier est un nom de fichier. Et chaque nom de fichier est quelque chose comme ceci:

\u0048\u0065\u006C\u006C\u006F

En d'autres termes, les caractères dans le fichier des noms de fichiers sont \, u, 0, 0, 4, 8 et ainsi de suite.

Si tel est le cas, ce que vous voyez est attendu. Java ne traduit que les séquences \uXXXX dans les littéraux de chaîne dans le code source (et lors de la lecture des objets Properties stockés). Lorsque vous lisez le contenu de votre fichier, vous aurez une chaîne composée des caractères \, u, 0, 0, 4, 8 et ainsi de suite et pas la chaîne Hello.

Vous devrez donc analyser cette chaîne pour extraire les morceaux 0048, 0065, etc. et ensuite les convertir en char et créer une chaîne à partir de ces char puis passer cette chaîne à la routine qui ouvre le fichier.

3voto

user7294900 Points 16410

Mises à jour concernant les réponses suggérant d'utiliser The Apache Commons Lang's: StringEscapeUtils.unescapeJava() - il a été obsolète,

Obsolète. à partir de la version 3.6, utilisez plutôt commons-text StringEscapeUtils

Le remplacement est Apache Commons Text's StringEscapeUtils.unescapeJava()

3voto

robertokl Points 1176

Je voulais juste contribuer avec ma version, en utilisant regex :

private static final String UNICODE_REGEX = "\\\\u([0-9a-f]{4})";
private static final Pattern UNICODE_PATTERN = Pattern.compile(UNICODE_REGEX);
...
String message = "\u0048\u0065\u006C\u006C\u006F World";
Matcher matcher = UNICODE_PATTERN.matcher(message);
StringBuffer decodedMessage = new StringBuffer();
while (matcher.find()) {
  matcher.appendReplacement(
      decodedMessage, String.valueOf((char) Integer.parseInt(matcher.group(1), 16)));
}
matcher.appendTail(decodedMessage);
System.out.println(decodedMessage.toString());

3voto

Marcelo Barros Points 454

Pour Java 9+, vous pouvez utiliser la nouvelle méthode replaceAll de la classe Matcher.

private static final Pattern UNICODE_PATTERN = Pattern.compile("\\\\u([0-9A-Fa-f]{4})");

public static String unescapeUnicode(String unescaped) {
    return UNICODE_PATTERN.matcher(unescaped).replaceAll(r -> String.valueOf((char) Integer.parseInt(r.group(1), 16)));
}

public static void main(String[] args) {
    String originalMessage = "\\u0048\\u0065\\u006C\\u006C\\u006F World";
    String unescapedMessage = unescapeUnicode(originalMessage);
    System.out.println(unescapedMessage);
}

Je crois que le principal avantage de cette approche par rapport à unescapeJava de StringEscapeUtils (outre le fait de ne pas utiliser de bibliothèque supplémentaire) est que vous pouvez convertir uniquement les caractères unicode (si vous le souhaitez), puisque ce dernier convertit tous les caractères Java échappés (comme \n ou \t). Si vous préférez convertir tous les caractères échappés, la bibliothèque est vraiment la meilleure option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X