我有 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();
}