Comment convertir une chaîne internationale (russe, par exemple) en nombres \u
(nombres unicode)
par exemple. \u041e\u041a
pour OK
?
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.
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.
Vous pouvez utiliser escapeJavaStyleString
à partir de org.Apache.commons.lang.StringEscapeUtils
.
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 Ä
.
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.
Il y a trois parties à la réponse
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.
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.
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"
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
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
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);
}
}