分音記号を削除する関数が 3 つあり、そのうちの 1 つを Android アプリで使用します。
最初のものには、android 2.2 以下では動作しないという欠点があります。
2 番目は良さそうですが、さまざまなデバイスで使用した場合にどの程度安全かはわかりません。
私が対処しなければならない唯一の分音記号は配列内のものであるため、私が書いた3番目のもの。
この関数は、10 バイト以下の小さな検索文字列に使用します。検索はアプリの主要な機能であるため、信頼できるソリューションが必要です。2 番目のオプションは本当にすべてのデバイスで機能しますか?
最初:
public static String removeDiacriticalMarks(String string) {
return Normalizer.normalize(string, Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}
2番目:
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();
}