У меня есть 3 функции для удаления диакритических знаков, и я буду использовать один из них в своем приложении для Android.Более безопасная функция для удаления диакритических знаков в андроиде (все версии)
Первый из них имеет недостаток в том, что он не работает с Android 2.2 и ниже.
Вторая кажется хорошей, но я не знаю, насколько она безопасна при использовании в самых разных устройствах.
Третий, который я написал, поскольку только диакритические знаки, которые мне придется иметь дело, являются внутри массива.
Я буду использовать эту функцию для небольших строк поиска не более 10 байт. Поиск - основная функция моего приложения, поэтому мне нужно надежное решение. Будет ли второй вариант действительно работать на всех устройствах?
ПЕРВЫЙ:
public static String removeDiacriticalMarks(String string) {
return Normalizer.normalize(string, Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}
ВТОРОЙ:
private static Map<Character, Character> MAP_NORM;
static {
MAP_NORM = new HashMap<Character, Character>();
MAP_NORM.put('á', 'a');
MAP_NORM.put('à', 'a');
MAP_NORM.put('ã', 'a');
MAP_NORM.put('â', 'a');
MAP_NORM.put('é', 'e');
MAP_NORM.put('ê', 'e');
MAP_NORM.put('í', 'i');
MAP_NORM.put('ó', 'o');
MAP_NORM.put('ô', 'o');
MAP_NORM.put('õ', 'o');
MAP_NORM.put('ú', 'u');
MAP_NORM.put('ü', 'u');
MAP_NORM.put('ç', 'c');
}
public static String removeAccents(String s) {
if (s == null) {
return null;
}
StringBuilder sb = new StringBuilder(s);
for(int i = 0; i < s.length(); i++) {
Character c = MAP_NORM.get(sb.charAt(i));
if(c != null) {
sb.setCharAt(i, c.charValue());
}
}
return sb.toString();
}
ТРЕТИЙ:
static Character charswap[] = {'á','a','à','a','ã','a','â','a','é','e','ê','e', 'í','i','ó','o','ô','o','õ','o','ú','u','ü','u','ç','c'};
public static String removeSWAP(String s) {
if (s == null) {
return null;
}
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < s.length(); i++) {
for (int k = 0; k < charswap.length; k+=2) {
if (s.charAt(i) == charswap[k]) {
sb.setCharAt(i, charswap[k+1]);
}
}
}
return sb.toString();
}
Как вы думаете, он будет работать на всех устройствах Android независимо от их языковых и региональных настроек? – Daniel
@ Daniel - Я ничего не вижу в коде, на который повлияют языковые или региональные настройки. Я полагаю, что у вас может быть проблема, если строка содержит базовые символы и объединяет диакритические знаки в виде отдельных символов (например, '' a \ u0301 "' вместо '" á "или' "\ u00e1" '), но это зависит от как генерируется строка, а не на языке или области. Чтобы охватить эту возможность, вы можете изменить приведенный выше код, чтобы пропустить отдельные комбинации меток, если они встречаются отдельно. –
Было бы так: http://pastebin.com/FDJJ63Bq? – Daniel