java - gui - jlabel definicion
Convierte cadenas internacionales a cรณdigos / u en java (10)
¿Cómo puedo convertir un String internacional (por ejemplo, ruso) en números (números Unicode)?
por ejemplo, /u041e/u041a
para OK
?
Apache commons StringEscapeUtils.escapeEcmaScript(String)
devuelve una cadena con caracteres unicode escapados con la notación /u
.
"Art of Beer ๐จ ๐บ" -> "Art of Beer /u1F3A8 /u1F37A"
Aquí hay una versión mejorada de la respuesta 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();
Esta versión escapa a todos los caracteres no ASCII y funciona correctamente para puntos de código Unicode bajo como Ä
.
En caso de que necesite esto para escribir un archivo .properties
, puede simplemente agregar las cadenas en un objeto Propiedades y luego guardarlo en un archivo. Cuidará la conversión.
Hay tres partes en la respuesta
- Obtén el Unicode para cada personaje
- Determine si está en la página cirílica
- Convertir a hexadecimal.
Para obtener cada personaje, puede iterar a través de la cadena utilizando los métodos charAt()
o toCharArray()
.
for( char c : s.toCharArray() )
El valor de la char es el valor Unicode.
Los caracteres cirílicos Unicode son cualquier carácter en los siguientes rangos:
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 está en este rango, es cirílico. Simplemente realice una verificación if. Si está en el rango, usa Integer.toHexString()
y antepone el "//u"
. Juntos deberían verse algo como esto:
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();
Editar: probablemente debería hacer el control c < 128
e invertir los cuerpos if
y else
; probablemente deberías escapar de todo lo que no sea ASCII. Probablemente fui demasiado literal al leer tu pregunta.
Hay una herramienta de línea de comandos que se envía con Java llamada native2ascii . Esto convierte archivos Unicode a archivos escapados de ASCII. Descubrí que este es un paso necesario para generar archivos .properties para la localización.
Probablemente puedas hackear si desde este código 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 - Yet Another JavaScript Unicode Encode / Decode
Puede usar escapeJavaStyleString
de org.apache.commons.lang.StringEscapeUtils
.
Solo algunos métodos básicos para eso (inspirados en la herramienta 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);
}
}
Yo también tuve este problema. Tenía algunos textos en portugués con algunos caracteres especiales, pero estos personajes ya estaban en formato unicode (por ejemplo: /u00e3
).
Entonces quiero convertir S/u00e3o
en São
.
Lo hice usando el Apache commons StringEscapeUtils . Como dijo @ sorin-sbarnea. Se puede descargar here
Usa el método unescapeJava
, así:
String text = "S/u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);
(También está el método escapeJava
, pero este pone los caracteres Unicode en la cadena).
Si alguien conoce una solución en Java puro, por favor díganos.
hay una herramienta JDK ejecutada a través de la línea de comandos de la siguiente manera:
native2ascii -encoding utf8 src.txt output.txt
Ejemplo:
src.txt
ุจุณู
ุงููู ุงูุฑุญู
ู ุงูุฑุญูู
salida.txt
/u0628/u0633/u0645 /u0627/u0644/u0644/u0647 /u0627/u0644/u0631/u062d/u0645/u0646 /u0627/u0644/u0631/u062d/u064a/u0645
Si desea usarlo en su aplicación Java, puede envolver esta línea de comando de la siguiente manera:
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");
Luego lea el contenido del nuevo archivo.