在android中删除变音符号的更安全的功能(所有版本)

时间:2013-08-12 02:51:15

标签: java android diacritics

我有3个功能可以删除变音符号,我会在我的Android应用中使用其中一个。

第一个缺点是不能使用Android 2.2及以下版本。

第二个似乎很好,但我不知道在各种设备中使用它会有多安全。

我写的第三个,因为我必须处理的变音标记是数组中的那些。

我将此函数用于不超过10个字节的小型搜索字符串。搜索是我的应用程序的主要功能,所以我需要一个可靠的解决方案。第二个选项是否真的适用于所有设备?

FIRST:

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

THIRD:

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

1 个答案:

答案 0 :(得分:0)

第二个对我来说似乎完全可靠。它似乎比第三个更易于维护(因为它对于正在发生的事情并不那么神秘)。它也可能更快。