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.

-1voto

nullpointer Points 1135

Une façon alternative d'accomplir ceci pourrait être d'utiliser [chars()](https://docs.oracle.com/javase/10/docs/api/java/lang/String.html#chars()) introduit avec Java 9, ceci peut être utilisé pour itérer sur les caractères en veillant à ce que tout caractère qui correspond à un point de code de remplacement soit passé sans être interprété. Ceci peut être utilisé comme suit :-

String myString = "\u0048\u0065\u006C\u006C\u006F World";
myString.chars().forEach(a -> System.out.print((char)a));
// affichera "Hello World"

-1voto

lovestackh343 Points 167

J'ai constaté que beaucoup des réponses ne répondaient pas à la question des "Caractères supplémentaires". Voici la manière correcte de les prendre en charge. Aucune bibliothèque tierce, implémentation Java pure.

http://www.oracle.com/us/technologies/java/supplementary-142654.html

public static String fromUnicode(String unicode) {
    String str = unicode.replace("\\", "");
    String[] arr = str.split("u");
    StringBuffer text = new StringBuffer();
    for (int i = 1; i < arr.length; i++) {
        int hexVal = Integer.parseInt(arr[i], 16);
        text.append(Character.toChars(hexVal));
    }
    return text.toString();
}

public static String toUnicode(String text) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < text.length(); i++) {
        int codePoint = text.codePointAt(i);
        // Skip over the second char in a surrogate pair
        if (codePoint > 0xffff) {
            i++;
        }
        String hex = Integer.toHexString(codePoint);
        sb.append("\\u");
        for (int j = 0; j < 4 - hex.length(); j++) {
            sb.append("0");
        }
        sb.append(hex);
    }
    return sb.toString();
}

@Test
public void toUnicode() {
    System.out.println(toUnicode("

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