La solution par @virgo47 est très rapide, mais approximatif. L'on a accepté la réponse utilise Normalisateur et une expression régulière. Je me demandais ce qu'une partie du temps a été pris par le Normalisateur rapport à l'expression régulière, depuis la suppression de tous les caractères non-ASCII peut être fait sans une regex:
import java.text.Normalizer;
public class Strip {
public static String flattenToAscii(String string) {
StringBuilder sb = new StringBuilder(string.length());
string = Normalizer.normalize(string, Normalizer.Form.NFD);
for (char c : string.toCharArray()) {
if (c <= '\u007F') sb.append(c);
}
return sb.toString();
}
}
Petit speed-ups peuvent être obtenus par écrit dans un char[] et ne pas appeler toCharArray(), bien que je ne suis pas sûr que la diminution dans le code de la clarté des mérites qu'elle:
public static String flattenToAscii(String string) {
char[] out = new char[string.length()];
string = Normalizer.normalize(string, Normalizer.Form.NFD);
int j = 0;
for (int i = 0, n = string.length(); i < n; ++i) {
char c = string.charAt(i);
if (c <= '\u007F') out[j++] = c;
}
return new String(out);
}
Cette variante a l'avantage de la justesse de l'une à l'aide de Normalisateur et certains de la vitesse de l'un à l'aide d'un tableau. Sur ma machine, celui-ci est d'environ 4x plus rapide que la accepté de répondre, et de 6,6 x à 7 fois plus lent que @virgo47 (accepté la réponse est sur le 26x plus lent que @virgo47 sur ma machine).