104 votes

Comment les caractères non-ASCII peuvent-ils être supprimés d'une chaîne de caractères?

J'ai des chaînes "A função", "Ãugent" dans lesquelles je dois remplacer des caractères comme ç, ã, et à par des chaînes vides.

Comment puis-je supprimer ces caractères non-ASCII de ma chaîne ?

J'ai essayé d'implémenter cela en utilisant la fonction suivante, mais cela ne fonctionne pas correctement. Un problème est que les caractères indésirables sont remplacés par le caractère espace.

public static String matchAndReplaceNonEnglishChar(String tmpsrcdta) {
    String newsrcdta = null;
    char array[] = Arrays.stringToCharArray(tmpsrcdta);
    if (array == null)
        return newsrcdta;

    for (int i = 0; i < array.length; i++) {
        int nVal = (int) array[i];
        boolean bISO =
                // Est-ce un caractère de contrôle ISO
                Character.isISOControl(array[i]);
        boolean bIgnorable =
                // Est-ce un identifiant ignoré
                Character.isIdentifierIgnorable(array[i]);
        // Supprimer le tabulation et d'autres caractères indésirables..
        if (nVal == 9 || bISO || bIgnorable)
            array[i] = ' ';
        else if (nVal > 255)
            array[i] = ' ';
    }
    newsrcdta = Arrays.charArrayToString(array);

    return newsrcdta;
}

185voto

FailedDev Points 15104

Cela recherchera et remplacera toutes les lettres non ASCII :

String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");

97voto

Buddy Casino Points 848

La réponse de FailedDev est bonne, mais peut être améliorée. Si vous souhaitez préserver les équivalents ascii, vous devez d'abord normaliser :

String subjectString = "öäü";
subjectString = Normalizer.normalize(subjectString, Normalizer.Form.NFD);
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");

=> produira "oau"

De cette façon, des caractères comme "öäü" seront transformés en "oau", ce qui préserve au moins certaines informations. Sans normalisation, la chaîne résultante sera vide.

27voto

stema Points 36113

Ceci serait la solution Unicode

String s = "A função, Ãugent";
String r = s.replaceAll("\\P{InBasic_Latin}", "");

\p{InBasic_Latin} est le bloc Unicode qui contient toutes les lettres dans la plage Unicode U+0000..U+007F (voir regular-expressions.info)

\P{InBasic_Latin} est la négation de \p{InBasic_Latin}

3voto

mmodi Points 6

Vous pouvez essayer quelque chose comme ça. La plage de caractères spéciaux pour les alphabets commence à partir de 192, donc vous pouvez éviter de tels caractères dans le résultat.

String name = "A função";

StringBuilder result = new StringBuilder();
for(char val : name.toCharArray()) {
    if(val < 192) result.append(val);
}
System.out.println("Résultat "+result.toString());

2voto

Rakesh Chaudhari Points 1032

Ou vous pouvez utiliser la fonction ci-dessous pour supprimer les caractères non-ascii de la chaîne. Vous apprendrez le fonctionnement interne.

private static String removeNonASCIIChar(String str) {
    StringBuffer buff = new StringBuffer();
    char chars[] = str.toCharArray();

    for (int i = 0; i < chars.length; i++) {
        if (0 < chars[i] && chars[i] < 127) {
            buff.append(chars[i]);
        }
    }
    return buff.toString();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X