web-dev-qa-db-fra.com

Comment détecter des caractères unicode dans une chaîne Java?

Supposons que j'ai une chaîne qui contient Ü. Comment pourrais-je trouver tous ces caractères Unicode? Devrais-je tester leur code? Comment je ferais ça?

Par exemple, étant donné la chaîne "AÜXÜ", j'aimerais la transformer en "AYXY". J'aimerais faire la même chose pour les autres caractères Unicode, et je détesterais devoir les stocker dans une carte de traduction quelconque.

21
Geo

La définition de "caractères unicode" est vague, mais on entendra par caractères UTF-8 non couverts par la norme ISO 8859 charset . Si cela est vrai dans votre cas, passez en revue tous les caractères de la chaîne et testez son code pour déterminer s'il fait partie du jeu de caractères indiqué.

Vous pouvez également utiliser un Map<Character, Character> et des caractères de la carte contenant les clés. Par exemple:

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

Ou voulez-vous dire "tous les caractères avec des signes diacritiques"? Si tel est le cas, utilisez Java.text.Normalizer pour supprimer les signes diacritiques:

/**
 * 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}+", "");
}

Un piège, Ü deviendrait U, pas Y. Je ne sais pas si c'est ce que vous recherchez. Si vous souhaitez remplacer par un caractère prononcé, vous devez vraiment créer un mappage. Bien sûr, c'est un travail fastidieux, mais cela prend moins de temps que nécessaire pour suivre ce sujet.

15
BalusC

Vous pouvez parcourir votre chaîne et pour chaque appel de caractère

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

Vous pourriez faire l'inverse et demander si le personnage est un personnage ascii.

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

Vous devrez ensuite analyser le caractère de chaîne par caractère, bien sûr.

(la méthode provient de commons-lang Charutils qui contient des tas de méthodes de caractères utiles)

12
msparer

Il m'est impossible de savoir exactement ce que l'on gagne en transformant "AÜXÜ" en "AYXY". Est-ce parce que Ü se prononce comme Y dans une langue donnée? Quelle langue? Et quelles autres règles pourraient s'appliquer?


En termes de terminologie ...

"a"

Ce qui précède est une chaîne Unicode. Il contient un seul caractère codé UTF-16.

Si vous souhaitez limiter la plage de caractères à l'alphabet anglais, jetez un coup d'œil au Normalisation effectuée dans cette réponse .

2
McDowell

D'après votre exemple, je ne suis pas sûr de ce que vous essayez de faire - si vous essayez simplement de remplacer toutes les valeurs non-ASCII par Y, vous pouvez alors parcourir la chaîne à la recherche de points de code situés en dehors de la plage 0 à 127, et remplacez-les ces points de code par Y.

1
Dominic Rodger

La classe Character offre également des méthodes intéressantes. Jetez un coup d'oeil.

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

Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false
0
Bhanu PS Kushwah