2013-08-12 2 views
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(); 
    } 

ответ

0

Второй кажется абсолютно надежным для меня. Он также кажется намного более удобным, чем третий (потому что он намного менее загадочен в том, что происходит). Скорее всего, быстрее.

+0

Как вы думаете, он будет работать на всех устройствах Android независимо от их языковых и региональных настроек? – Daniel

+0

@ Daniel - Я ничего не вижу в коде, на который повлияют языковые или региональные настройки. Я полагаю, что у вас может быть проблема, если строка содержит базовые символы и объединяет диакритические знаки в виде отдельных символов (например, '' a \ u0301 "' вместо '" á "или' "\ u00e1" '), но это зависит от как генерируется строка, а не на языке или области. Чтобы охватить эту возможность, вы можете изменить приведенный выше код, чтобы пропустить отдельные комбинации меток, если они встречаются отдельно. –

+0

Было бы так: http://pastebin.com/FDJJ63Bq? – Daniel

Смежные вопросы