Решение @ virgo47 очень быстрое, но приблизительное. В принятом ответе используется Normalizer и регулярное выражение. Я задавался вопросом, какая часть времени была занята Normalizer по сравнению с регулярным выражением, так как удаление всех символов, отличных от ASCII, может выполняться без регулярного выражения:
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();
}
}
Небольшие дополнительные ускорения могут быть получены путем записывая в char [], а не вызывая toCharArray (), хотя я не уверен, что уменьшение ясности кода заслуживает этого:
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);
}
У этого варианта есть преимущество правильности той, которая используется Нормализатор и часть скорости, используемой таблицей. На моей машине это примерно в 4 раза быстрее, чем принятый ответ, а от 6,6 до 7 раз медленнее, чем @ virgo47 (принятый ответ примерно на 26 раз медленнее, чем @ virgo47 на моей машине).