0

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

1 回答 1

0

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

于 2013-08-12T02:55:10.817 回答