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.
Ceci recherchera et remplacera toutes les lettres non_ ASCII:
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
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.
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
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());
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();
}