web-dev-qa-db-fra.com

Remplacer non ASCII caractère de chaîne

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

Comment faire correspondre uniquement ces caractères non ASCII?

j'utilise une fonction 

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 = Character.isISOControl(array[i]); // Is character ISO control
            boolean bIgnorable = Character.isIdentifierIgnorable(array[i]); // Is Ignorable identifier
            // Remove tab and other unwanted characters..
            if (nVal == 9 || bISO || bIgnorable)
                array[i] = ' ';
            else if (nVal > 255)
                array[i] = ' ';
        }
        newsrcdta = Arrays.charArrayToString(array);

        return newsrcdta;
    }

mais cela ne fonctionne pas correctement .. quelle amélioration il est nécessaire ... Ici, j'ai un autre problème, c'est que la chaîne finale est remplacée par le caractère espace qui crée l'espace supplémentaire dans la chaîne. 

61
rahulsri

Ceci recherchera et remplacera toutes les lettres non_ ASCII:

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

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

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

=> will produce "oau"

De cette façon, les caractères tels que "öäü" seront mappés sur "oau", ce qui au moins conserve certaines informations. Sans normalisation, la chaîne résultante sera vide.

64
Michael Böckling

Ce 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 de la plage Unicode U + 0000..U + 007F (voir expression-remploie.info )

\P{InBasic_Latin} est le \p{InBasic_Latin} négatif

19
stema

Vous pouvez essayer quelque chose comme ça. La plage de caractères spéciaux pour les alphabets commence à 192, vous pouvez donc é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("Result "+result.toString());
2
mmodi

Ou vous pouvez utiliser la fonction ci-dessous pour supprimer les caractères non-ascii de la chaîne ..___.

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

    } 
0
Rakesh Chaudhari