2011-09-19 3 views
18

다음 문자열 "áe"를 되돌리고 싶다고합시다.반전 된 문자열을 얻는 방법 (유니 코드 안전)

그 유니 코드는 "\ u0061 \ u0301 \ u0065"입니다.

를 되 돌리는의 순진 aproach는 문자로 숯불 될 것이다 "EA를"(\ u0065 \ u0301 \ u0061) 우리가 얻을 수 있도록 노력하겠습니다 때 "EA"(\ u0065 \ u0061 \ 우리를 제공

private static String reverseStringNaive(String s) { 
    char[] characters = new char[s.length()]; 
    for (int i = s.length() - 1; i >= 0; i--) { 
     int j = s.length() - i - 1; 
     characters[j] = s.charAt(i); 
    } 
    return new String(characters); 
} 

u0301). 악센트 " '"는 "a"와 함께 붙어야하며 "e"로 변경하면 안됩니다. 각 문자는 문자, 숫자 또는 ISO 컨트롤의 경우 내가 확인하고 있습니다

private static String reverseString(String s) { 
    char[] characters = new char[s.length()]; 
    for (int i = s.length() - 1; i >= 0; i--) { 
     int j = s.length() - i - 1; 
     if (Character.isLetterOrDigit(s.charAt(i)) || Character.isISOControl(s.charAt(i))) { 
      characters[j] = s.charAt(i); 
     } else { 
      characters[j] = s.charAt(i-1); 
      characters[j+1] = s.charAt(i); 
      i--; 
     } 
    } 
    return new String(characters); 
} 

:

다음 코드는 나에게 그 문자열에 대한 예상 결과를 제공합니다. 그렇지 않다면 나는 이전 캐릭터와 함께해야한다고 가정하고 있습니다.

질문은 내가 확인하거나 걱정해야 할 다른 것이 있습니까? 내 관심사는 아직도 순진하고 있습니까?

+0

http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html#reverse(java.lang.String)은 어떤가요? –

+0

그것은 순진한 접근을합니다. 잘못된 결과를줍니다. – pablosaraiva

+0

javadoc에 따르면,이 클래스는'StringBuffer.reverse()'를 사용합니다.이 함수는 http://download.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuffer.html#reverse () –

답변

4

문자열을 표준 분해 형식 NFC로 변환하여 문제를 해결할 수도 있습니다. 기본적으로 java.text.Normalizer 클래스는 액센트와 다른 결합 문자를 기본 문자와 결합하여 올바르게 반전 할 수 있도록합니다.

이러한 모든 다른 아이디어 (String.reverse(), StringBuffer.reverse())는 버퍼의 문자를 올바르게 되돌려 주지만, 분해 된 문자로 시작하면 기대 한 바를 얻을 수 없을 수도 있습니다. :)

일부 "분해 양식"에서는 악센트 문자가 기본 양식과 별도로 (별도의 문자로) 저장되지만 "결합 된"형태로는 저장되지 않습니다. 따라서 하나의 형식에서 "áe"는 세 문자로 저장되고 다른 형식에서는 두 개로 저장됩니다.

그러나 이러한 정규화는 다른 종류의 문자 조합을 처리하기에 충분하지 않으며 Java에서 두 문자 (또는 그 이상)로 저장되는 유니 코드 아스트랄 평면의 문자도 설명 할 수 없습니다.

아래 주석 (virama 참조)에서 확인 된 것과 같은 확장 된 제 스페어 클러스터를 포함하여 텍스트 분할에 대한 ICU 지원을 지적 해 주신 tchrist에게 감사드립니다. This resource은 이런 종류의 정보에 대한 권위있는 정보원 인 것 같습니다.

+0

NFC 양식을 사용하면 작동합니다. – pablosaraiva

+0

NFD가 아닌 NFC를 보여주기 위해 내 대답을 편집했습니다. –

+0

실제로 입력 한 내용에 대해 작동하는 멋진 aproach이지만, 다음 문자열에는 실패합니다. सरस्वती. – pablosaraiva

관련 문제