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

Wefyns Points 19

Rapide

fun unicodeDecode(unicode: String): String {
        val stringBuffer = StringBuilder()
        var i = 0
        while (i < unicode.length) {
            if (i + 1 < unicode.length)
                if (unicode[i].toString() + unicode[i + 1].toString() == "\\u") {
                    val symbol = unicode.substring(i + 2, i + 6)
                    val c = Integer.parseInt(symbol, 16)
                    stringBuffer.append(c.toChar())
                    i += 5
                } else stringBuffer.append(unicode[i])
            i++
        }
        return stringBuffer.toString()
    }

0voto

Michael Gantman Points 1936

En réalité, j'ai écrit une bibliothèque Open Source qui contient quelques utilitaires. L'un d'eux consiste à convertir une séquence Unicode en String et vice-versa. Je l'ai trouvé très utile. Voici la citation de l'article sur cette bibliothèque à propos du convertisseur Unicode :

La classe StringUnicodeEncoderDecoder dispose de méthodes qui peuvent convertir une chaîne de caractères (dans n'importe quelle langue) en une séquence de caractères Unicode et vice-versa. Par exemple, une chaîne "Hello World" sera convertie en

"\u0048\u0065\u006c\u006c\u006f\u0020 \u0057\u006f\u0072\u006c\u0064"

et peut être restaurée.

Voici le lien vers l'article complet qui explique quels utilitaires la bibliothèque propose et comment obtenir la bibliothèque pour l'utiliser. Elle est disponible en tant qu'artifact Maven ou en tant que source sur Github. Elle est très facile à utiliser. Bibliothèque Java open source avec filtrage de la pile d'appels, analyse silencieuse de chaînes Unicode et comparaison de versions

0voto

Jun.wan Points 69

@NominSim Il peut y avoir d'autres caractères, donc je devrais les détecter par leur longueur.

private String forceUtf8Coding(String str) {
    str = str.replace("\\","");
    String[] arr = str.split("u");
    StringBuilder texte = new StringBuilder();
    for(int i = 1; i < arr.length; i++){
        String a = arr[i];
        String b = "";
        if (arr[i].length() > 4){
            a = arr[i].substring(0, 4);
            b = arr[i].substring(4);
        }
        int hexVal = Integer.parseInt(a, 16);
        texte.append((char) hexVal).append(b);
    }
    return texte.toString();
}

0voto

anton Points 120

UnicodeUnescaper de Apache Commons Text fait exactement ce que vous voulez et ignore toutes les autres séquences d'échappement.

String input = "\\u0048\\u0065\\u006C\\u006C\\u006F World";
String output = new UnicodeUnescaper().translate(input);
assert("Hello World".equals(output));
assert("\u0048\u0065\u006C\u006C\u006F World".equals(output));

input serait la chaîne que vous lisez à partir d'un fichier.

-1voto

Evgeny Lebedev Points 721

Solution pour Kotlin:

val sourceContent = File("test.txt").readText(Charset.forName("windows-1251"))
val result = String(sourceContent.toByteArray())

Kotlin utilise UTF-8 partout comme encodage par défaut.

La méthode toByteArray() a un argument par défaut - Charsets.UTF_8.

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