web-dev-qa-db-fra.com

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

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

42
ehsun7b

Si vous en avez besoin pour écrire un fichier .properties, vous pouvez simplement ajouter les chaînes dans un objet Propriétés, puis l'enregistrer dans un fichier. Il prendra soin de la conversion.

8
x4u

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 souhaitez l'utiliser dans votre application Java, vous pouvez envelopper cette ligne de commande en: 

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");

Ensuite, lisez le contenu du nouveau fichier.

50
Abdennour TOUMI

Vous pouvez utiliser escapeJavaStyleString à partir de org.Apache.commons.lang.StringEscapeUtils.

22
sorin

Voici une version améliorée de La réponse d'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 faibles tels que Ä.

14
mik01aj

J'ai aussi 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 souhaite donc convertir S\u00e3o en São.

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

Utilisez la méthode unescapeJava, comme ceci:

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

(Il y a aussi la méthode escapeJava, mais celle-ci place les caractères unicode dans la chaîne.)

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

14
Derzu

Il y a trois parties à la réponse

  1. Obtenez le code Unicode pour chaque personnage
  2. Déterminez si c'est dans la page cyrillique
  3. Convertir en hexadécimal.

Pour obtenir chaque caractère, vous pouvez parcourir la chaîne en utilisant les méthodes charAt() ou toCharArray() .

for( char c : s.toCharArray() )

La valeur du caractère est la valeur Unicode. 

Les caractères Cyrillic Unicode sont tous les caractères compris dans les 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)

Si c'est dans cette gamme c'est cyrillique. Il suffit de faire une vérification si. S'il se trouve dans la plage, utilisez Integer.toHexString() et ajoutez le "\\u" au début. Mis ensemble, cela devrait ressembler à quelque chose comme ça:

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();

Edit: devrait probablement effectuer la vérification c < 128 et inverser les corps if et else; vous probablement devriez échapper à tout ce qui n'est pas ASCII. J'étais probablement trop littérale dans ma lecture de votre question.

11
ArtB

Il existe un outil de ligne de commande livré avec Java appelé native2ascii . Cela convertit les fichiers unicode en fichiers à échappement ASCII. J'ai constaté qu'il s'agissait d'une étape nécessaire à la génération de fichiers .properties pour la localisation.

7
Sam Barnum

Apache commons StringEscapeUtils.escapeEcmaScript(String) renvoie une chaîne contenant des caractères unicode protégés par la notation \u.

"Art of Beer ???? ????" -> "Art of Beer \u1F3A8 \u1F37A"
4
davidofmorris

Il existe une bibliothèque Java Open Source MgntUtils qui comporte un utilitaire qui convertit les chaînes en séquence unicode et inversement:

result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

La sortie de ce code est:

\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World

La bibliothèque peut être trouvée à Maven Central ou à Github Elle se présente sous la forme d’un artefact maven et avec des sources et javadoc

Voici javadoc pour la classe StringUnicodeEncoderDecoder

1
Michael Gantman

Vous pourriez probablement pirater si de ce code JavaScript:

/* convert ???? to \uD83D\uDE4C */
function text_to_unicode(string) {
  'use strict';

  function is_whitespace(c) { return 9 === c || 10 === c || 13 === c || 32 === c;  }
  function left_pad(string) { return Array(4).concat(string).join('0').slice(-1 * Math.max(4, string.length)); }

  string = string.split('').map(function(c){ return "\\u" + left_pad(c.charCodeAt(0).toString(16).toUpperCase()); }).join('');

  return string;
}


/* convert \uD83D\uDE4C to ???? */
function unicode_to_text(string) {
  var  prefix = "\\\\u"
     , regex  = new RegExp(prefix + "([\da-f]{4})","ig")
     ; 

  string = string.replace(regex, function(match, backtrace1){
    return String.fromCharCode( parseInt(backtrace1, 16) )
  });

  return string;
}

source: iCompile - Encore un autre code JavaScript Unicode/Decode

0
user257319

Quelques méthodes de base pour cela (inspirées de l'outil native2ascii):

/**
 * Encode a String like äöü to \u00e4\u00f6\u00fc
 * 
 * @param text
 * @return
 */
public String native2ascii(String text) {
    if (text == null)
        return text;
    StringBuilder sb = new StringBuilder();
    for (char ch : text.toCharArray()) {
        sb.append(native2ascii(ch));
    }
    return sb.toString();
}

/**
 * Encode a Character like ä to \u00e4
 * 
 * @param ch
 * @return
 */
public String native2ascii(char ch) {
    if (ch > '\u007f') {
        StringBuilder sb = new StringBuilder();
        // write \udddd
        sb.append("\\u");
        StringBuffer hex = new StringBuffer(Integer.toHexString(ch));
        hex.reverse();
        int length = 4 - hex.length();
        for (int j = 0; j < length; j++) {
            hex.append('0');
        }
        for (int j = 0; j < 4; j++) {
            sb.append(hex.charAt(3 - j));
        }
        return sb.toString();
    } else {
        return Character.toString(ch);
    }
}
0
larsilus