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.

104voto

Tony Points 1228

Le Apache Commons Lang StringEscapeUtils.unescapeJava() peut le décoder correctement.

import org.apache.commons.lang.StringEscapeUtils;

@Test
public void testUnescapeJava() {
    String sJava="\\u0048\\u0065\\u006C\\u006C\\u006F";
    System.out.println("StringEscapeUtils.unescapeJava(sJava):\n" + StringEscapeUtils.unescapeJava(sJava));
}

 output:
 StringEscapeUtils.unescapeJava(sJava):
 Hello

51voto

NominSim Points 5160

Techniquement en train de faire:

String myString = "\u0048\u0065\u006C\u006C\u006F World";

le convertit automatiquement en "Hello World", donc je suppose que vous lisez la chaîne à partir d'un fichier. Pour le convertir en "Hello", vous devrez analyser le texte en chiffres unicode séparés, (prendre le \uXXXX et obtenir simplement XXXX) puis faire Integer.ParseInt(XXXX, 16) pour obtenir une valeur hexadécimale et ensuite la convertir en char pour obtenir le caractère réel.

Éditer : Un peu de code pour accomplir ceci:

String str = myString.split(" ")[0];
str = str.replace("\\","");
String[] arr = str.split("u");
String text = "";
for(int i = 1; i < arr.length; i++){
    int hexVal = Integer.parseInt(arr[i], 16);
    text += (char)hexVal;
}
// Le texte aura maintenant Hello

32voto

Pedro Lobito Points 6794

Vous pouvez utiliser StringEscapeUtils de Apache Commons Lang, c'est-à-dire :

String Title = StringEscapeUtils.unescapeJava("\\u0048\\u0065\\u006C\\u006C\\u006F");

9voto

andrew pate Points 54

Cette méthode simple fonctionnera pour la plupart des cas, mais elle aurait des problèmes avec quelque chose comme "u005Cu005C" qui devrait décoder en la chaîne "\u0048" mais décoderait en fait "H" car lors du premier passage elle produit "\u0048" comme chaîne de travail qui est ensuite traitée à nouveau par la boucle while.

static final String decode(final String in)
{
    String working = in;
    int index;
    index = working.indexOf("\\u");
    while(index > -1)
    {
        int length = working.length();
        if(index > (length-6))break;
        int numStart = index + 2;
        int numFinish = numStart + 4;
        String substring = working.substring(numStart, numFinish);
        int number = Integer.parseInt(substring,16);
        String stringStart = working.substring(0, index);
        String stringEnd   = working.substring(numFinish);
        working = stringStart + ((char)number) + stringEnd;
        index = working.indexOf("\\u");
    }
    return working;
}

7voto

ssuukk Points 485

Version plus courte:

public static String unescapeJava(String escaped) {
    if(escaped.indexOf("\\u")==-1)
        return escaped;

    String processed="";

    int position=escaped.indexOf("\\u");
    while(position!=-1) {
        if(position!=0)
            processed+=escaped.substring(0,position);
        String token=escaped.substring(position+2,position+6);
        escaped=escaped.substring(position+6);
        processed+=(char)Integer.parseInt(token,16);
        position=escaped.indexOf("\\u");
    }
    processed+=escaped;

    return processed;
}

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