53 votes

Convertir une chaîne internationale en \u Codes en java

Comment puis-je convertir une chaîne internationale (par exemple russe) en \u nombres (nombres unicode)
par exemple \u041e\u041a pour OK ?

62voto

Il existe un Outils JDK exécuté via la ligne de commande comme suit :

native2ascii -encoding utf8 src.txt output.txt

Exemple :

src.txt

بسم الله الرحمن الرحيم

output.txt

\u0628\u0633\u0645 \u0627\u0644\u0644\u0647 \u0627\u0644\u0631\u062d\u0645\u0646 \u0627\u0644\u0631\u062d\u064a\u0645

Si vous voulez l'utiliser dans votre application Java, vous pouvez envelopper cette ligne de commande par :

String pathSrc = "./tmp/src.txt";
String pathOut = "./tmp/output.txt";
String cmdLine = "native2ascii -encoding utf8 " + new File(pathSrc).getAbsolutePath() + " " + new File(pathOut).getAbsolutePath();
Runtime.getRuntime().exec(cmdLine);
System.out.println("THE END");

Puis lire le contenu du nouveau fichier.

23voto

sorin Points 23747

Vous pourriez utiliser escapeJavaStyleString de org.apache.commons.lang.StringEscapeUtils .

9 votes

Il semble que cette méthode ait été renommée escapeJava dans les versions 3.x

0 votes

Et ne s'échappe pas vers \uXXXX

0 votes

Vous feriez mieux de ne pas l'utiliser ;) Voir la réponse à : stackoverflow.com/a/4298836/115493

16voto

Derzu Points 2463

J'ai également eu ce problème. J'avais du texte portugais avec des caractères spéciaux, mais ces caractères étaient déjà au format unicode (ex.. : \u00e3 ).

Je veux donc convertir S\u00e3o à São .

Je l'ai fait en utilisant l'apache commons StringEscapeUtils . Comme l'a dit @sorin-sbarnea. Peut être téléchargé aquí .

Utilisez la méthode unescapeJava comme ceci :

String text = "S\u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);

(Il existe également la méthode escapeJava mais celui-ci met les caractères unicode dans la chaîne).

Si quelqu'un connaît une solution en Java pur, merci de nous le dire.

16voto

m01 Points 1368

Voici une version améliorée de La réponse de ArtB :

    StringBuilder b = new StringBuilder();

    for (char c : input.toCharArray()) {
        if (c >= 128)
            b.append("\\u").append(String.format("%04X", (int) c));
        else
            b.append(c);
    }

    return b.toString();

Cette version échappe tous les caractères non ASCII et fonctionne correctement pour les points de code Unicode bas comme Ä .

1 votes

Cela fonctionne-t-il pour les caractères à plusieurs octets, par exemple lorsque 4-6-8 octets (2, 3, 4 java char ) dans une rangée ne représentent qu'un seul symbole ?

0 votes

Ce n'est pas le cas, parce qu'il itère en utilisant un unique char .

12voto

ArtB Points 3922

La réponse comporte trois parties

  1. Obtenir l'Unicode pour chaque caractère
  2. Déterminer si elle est en page cyrillique
  3. Convertir en hexadécimal.

Pour obtenir chaque caractère, vous pouvez itérer dans la chaîne en utilisant la fonction charAt() ou [toCharArray()](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toCharArray()) méthodes.

for( char c : s.toCharArray() )

La valeur du caractère est la valeur Unicode.

Le site Cyrillique Unicode Les caractères sont tous les caractères des plages suivantes :

Cyrillic:            U+0400–U+04FF ( 1024 -  1279)
Cyrillic Supplement: U+0500–U+052F ( 1280 -  1327)
Cyrillic Extended-A: U+2DE0–U+2DFF (11744 - 11775)
Cyrillic Extended-B: U+A640–U+A69F (42560 - 42655)

S'il se trouve dans cette fourchette, il s'agit d'un cyrillique. Il suffit d'effectuer une vérification if. S'il est dans l'intervalle, utilisez Integer.toHexString() et faire précéder le "\\u" . Mis ensemble, cela devrait ressembler à quelque chose comme ceci :

final int[][] ranges = new int[][]{ 
        {  1024,  1279 }, 
        {  1280,  1327 }, 
        { 11744, 11775 }, 
        { 42560, 42655 },
    };
StringBuilder b = new StringBuilder();

for( char c : s.toCharArray() ){
    int[] insideRange = null;
    for( int[] range : ranges ){
        if( range[0] <= c && c <= range[1] ){
            insideRange = range;
            break;
        }
    }

    if( insideRange != null ){
        b.append( "\\u" ).append( Integer.toHexString(c) );
    }else{
        b.append( c );
    }
}

return b.toString();

Edita: devrait probablement faire le chèque c < 128 et inverser le if et le else corps ; vous probablement doit échapper à tout ce qui n'est pas ASCII. J'ai probablement été trop littéral dans ma lecture de votre question.

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