2009-11-04 35 views
21

Supongamos que tengo una cuerda que contiene Ü. ¿Cómo encontraría todos esos caracteres Unicode? ¿Debería probar su código? ¿Como podría hacerlo?¿Cómo puedo detectar caracteres Unicode en una cadena de Java?

Por ejemplo, dada la cadena "AÜXÜ", me gustaría transformarlo en "AYXY". Me gustaría hacer lo mismo para otros personajes Unicode, y odiaría tener que almacenarlos en un mapa de traducción de algún tipo.

+3

¿Cómo sabes lo que va a asignar sin su propio mapa?No existe un mapeo simple y sospecho que en diferentes idiomas cualquier mapeo puede diferir – Mark

+0

en realidad puede hacerlo mirando los caracteres uno por uno. Depende del "rango" de la char, pero es bajo y silencioso, y supongo que ya existe algo para lograr esta tarea. ver http://en.wikipedia.org/wiki/Unicode – Aif

+0

También vea la solución aquí: https://rosettacode.org/wiki/Strip_control_codes_and_extended_characters_from_a_string#Java – Stan

Respuesta

15

la definición de "caracteres Unicode" es vaga, pero será llevado a significa caracteres UTF-8 no cubiertos por la norma ISO 8859 charset. Si esto es cierto en su caso, recorra todos los caracteres en la Cadena y pruebe su punto de código para determinar si está dentro del conjunto de caracteres dado.

Como alternativa, utilice un Map<Character, Character> y los caracteres en el mapa que contienen coinciden con las claves. Por ejemplo:

Map<Character, Character> charReplacementMap = new HashMap<Character, Character>() {{ 
    put('Ü', 'Y'); 
    // Put more here. 
}}; 

String originalString = "AÜAÜ"; 
StringBuilder builder = new StringBuilder(); 

for (char currentChar : originalString.toCharArray()) { 
    Character replacementChar = charReplacementMap.get(currentChar); 
    builder.append(replacementChar != null ? replacementChar : currentChar); 
} 

String newString = builder.toString(); 

O, ¿te refieres a "todos los caracteres con signos diacríticos"? Si es así, a continuación, utilizar java.text.Normalizer para eliminar los signos diacríticos:

/** 
* Remove any diacritical marks (accents like ç, ñ, é, etc) from 
* the given string (so that it returns plain c, n, e, etc). 
* @param string The string to remove diacritical marks from. 
* @return The string with removed diacritical marks, if any. 
*/ 
public static String removeDiacriticalMarks(String string) { 
    return Normalizer.normalize(string, Form.NFD) 
     .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
} 

Una trampa, Ü se convertiría en U, no Y. No estoy seguro si eso es lo que está buscando. Si desea reemplazar por carácter pronunciado, realmente necesitará crear un mapeo. Claro, es un trabajo tedioso, pero se hace en menos tiempo de lo necesario para seguir este tema.

+0

Así es como lo hice habitualmente. Pero esto requeriría que agregues cada personaje en el mapa. – Geo

+0

No veo ninguna otra opción eficiente para reemplazar cierto personaje por un cierto personaje y para más de un personaje. – BalusC

+1

Si no agrega cada carácter al mapa, ¿cómo define el reemplazo? ¿O quieres que todos los personajes no ascii sean reemplazados por un solo personaje ascii? –

11

Podrías ir al revés y preguntar si el personaje es un personaje ascii.

public static boolean isAscii(char ch) { 
    return ch < 128; 
} 

Tendría que analizar la cadena char por char, por supuesto.

(el método es de commons-lang Charutils que contiene un montón de métodos de carácter útil)

1

no estoy seguro de su ejemplo lo que estás tratando de hacer - si usted está tratando de reemplazar a todos los no-ASCII valores con y, entonces se podría bucle a través de la cadena en busca de puntos de código fuera del rango de 0 a 127, y les sustituir a los puntos de código con Y.

12

Usted podría bucle a través de la cadena y por cada llamada de carácter

If (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) { 
// replace with Y 
} 
+0

Bueno para probar los puntos de código, pero no tengo la impresión de que quiera reemplazar * cada * carácter por Y. – BalusC

+0

Bueno, dice unicode Por eso, los personajes entiendo que probablemente significa reemplazar todos los caracteres no ascii con Y. lo que sea – jitter

2

No me queda claro exactamente lo que se gana mediante la transformación de "AÜXÜ" a "AYXY". ¿Esto es porque Ü se pronuncia como Y en un idioma particular? ¿Que lenguaje? ¿Y qué otras reglas podrían aplicarse?


En cuanto a la terminología ...

"a" 

Lo anterior es una cadena Unicode. Contiene un solo carácter codificado en UTF-16.

Si desea limitar el rango de caracteres al alfabeto inglés, eche un vistazo al Normalization performed in this answer.

+0

Fue solo un ejemplo de reemplazo. De hecho, reemplazaré el personaje por '_XX_' :) – Geo

0

La clase Character también ofrece algunos métodos interesantes. Mira esto.

Character.UnicodeBlock.of('a') == Character.UnicodeBlock.BASIC_LATIN; //true 

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false 
Cuestiones relacionadas