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.

2voto

Subraminion Points 336

J'ai écrit une solution performante et sans erreur :

public static final String decode(final String in) {
    int p1 = in.indexOf("\\u");
    if (p1 < 0)
        return in;
    StringBuilder sb = new StringBuilder();
    while (true) {
        int p2 = p1 + 6;
        if (p2 > in.length()) {
            sb.append(in.subSequence(p1, in.length()));
            break;
        }
        try {
            int c = Integer.parseInt(in.substring(p1 + 2, p1 + 6), 16);
            sb.append((char) c);
            p1 += 6;
        } catch (Exception e) {
            sb.append(in.subSequence(p1, p1 + 2));
            p1 += 2;
        }
        int p0 = in.indexOf("\\u", p1);
        if (p0 < 0) {
            sb.append(in.subSequence(p1, in.length()));
            break;
        } else {
            sb.append(in.subSequence(p1, p0));
            p1 = p0;
        }
    }
    return sb.toString();
}

2voto

Yevhen Railian Points 81

Avec Kotlin, vous pouvez écrire votre propre fonction d'extension pour String

fun String.unescapeUnicode() = replace("\\\\u([0-9A-Fa-f]{4})".toRegex()) {
    String(Character.toChars(it.groupValues[1].toInt(radix = 16)))
}

et ensuite

fun main() {
    val originalString = "\\u0048\\u0065\\u006C\\u006C\\u006F World"
    println(originalString.unescapeUnicode())
}

1voto

haohcraft Points 459

Essayez

private static final Charset UTF_8 = Charset.forName("UTF-8");
private String forceUtf8Coding(String input) { return new String(input.getBytes(UTF_8), UTF_8);}

1voto

Ashkan Ghodrat Points 316

Une façon simple que je connais en utilisant JsonObject:

try {
    JSONObject json = new JSONObject();
    json.put("string", myString);
    String converted = json.getString("string");

} catch (JSONException e) {
    e.printStackTrace();
}

1voto

AndyW58 Points 167

Voici ma solution...

                String decodedName = JwtJson.substring(startOfName, endOfName);

                StringBuilder builtName = new StringBuilder();

                int i = 0;

                while ( i < decodedName.length() )
                {
                    if ( decodedName.substring(i).startsWith("\\u"))
                    {
                        i=i+2;
                        builtName.append(Character.toChars(Integer.parseInt(decodedName.substring(i,i+4), 16)));
                        i=i+4;
                    }
                    else
                    {
                        builtName.append(decodedName.charAt(i));
                        i = i+1;
                    }
                };

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