2013-08-12 2 views
0

필자는 분음 기호를 제거하는 3 가지 기능을 가지고 있으며, 그 중 하나를 Android 앱에서 사용합니다.안드로이드 (모든 버전)에서 분음 기호를 제거하는보다 안전한 기능

첫 번째는 안드로이드 2.2 이하에서 작동하지 않는다는 단점이 있습니다.

두 번째는 좋아 보이지만 다양한 기기에서 사용할 때 얼마나 안전 할 지 모르겠습니다.

분음 기호 만 처리해야 할 것이기 때문에 내가 작성한 세 번째 것은 배열 안에있는 것입니다.

이 기능은 10 바이트 이하의 작은 검색 문자열에 사용합니다. 검색은 내 앱의 주요 기능이므로 신뢰할 수있는 솔루션이 필요합니다. 두 번째 옵션이 모든 장치에서 실제로 작동합니까? FIRST

:

public static String removeDiacriticalMarks(String string) { 
     return Normalizer.normalize(string, Form.NFD) 
      .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
    } 

SECOND :

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 - 언어 또는 지역 설정의 영향을받는 코드에는 아무 것도 표시되지 않습니다. 문자열에 기본 문자가 포함되어 있고 분음 기호를 별도의 문자 (예 :''á "또는'"\ u00e1 "'대신"a \ u0301 ")로 결합하면 문제가 발생할 수 있다고 생각합니다. 언어 나 지역이 아닌 문자열 생성 방법. 이러한 가능성을 보완하기 위해 위의 코드가 개별적으로 발생하는 경우 개별 결합 표시 자체를 건너 뛰도록 수정할 수 있습니다. –

+0

이게 될까요? http://pastebin.com/FDJJ63Bq? – Daniel