2014-10-19 2 views
5

내 목표는 문자하지만 아래의 코드로 유니 코드 텍스트 문자의 문자열을 반복하는 것입니다 내가 코드를 반복하도록되어 next32PostInc()를 사용하고 있더라도 코드 단위 대신 코드 포인트을 반복되는 코드 포인트 포인트 :ICU의 반복 처리는

void iterate_codepoints(UCharCharacterIterator &it, std::string &str) { 
    UChar32 c; 
    while (it.hasNext()) { 
     c = it.next32PostInc(); 
     str += c; 
    } 
} 

void my_test() { 
    const char testChars[] = "\xE6\x96\xAF"; // Chinese character 斯 in UTF-8 
    UnicodeString testString(testChars, ""); 
    const UChar *testText = testString.getTerminatedBuffer(); 

    UCharCharacterIterator iter(testText, u_strlen(testText)); 

    std::string str; 
    iterate_codepoints(iter, str); 
    std::cout << str; // outputs 斯 in UTF-8 format 
} 


int main() { 
    my_test(); 
    return 0; 
} 

위의 코드는 중국 문자 올바른 출력을 생성 斯하지만 3 반복 누군가가 내가 잘못 뭐하는 거지 설명 할 수 대신 1의 단일 문자 발생하는?

간단히 말해 루프 내에서 문자을 트래버스하고 싶은데 ICU 반복 클래스가 필요한 경우 사용하기 편리합니다.

여전히이 문제를 해결하려고 ...

는 또한 아래와 같이 유니 코드 스트링을 사용하여 나쁜 행동을 관찰했다. 나는 소스 데이터 때문에 VC++ 2013

void test_02() { 
    // UnicodeString us = "abc 123 ñ";  // results in good UTF-8: 61 62 63 20 31 32 33 20 c3 b1 
    // UnicodeString us = "斯";    // results in bad UTF-8: 3f 
    // UnicodeString us = "abc 123 ñ 斯"; // results in bad UTF-8: 61 62 63 20 31 32 33 20 c3 b1 20 3f (only the last part '3f' is corrupt) 
    // UnicodeString us = "\xE6\x96\xAF"; // results in bad UTF-8: 00 55 24 04 c4 00 24 
    // UnicodeString us = "\x61";   // results in good UTF-8: 61 
    // UnicodeString us = "\x61\x62\x63"; // results in good UTF-8: 61 62 63 
    // UnicodeString us = "\xC3\xB1";  // results in bad UTF-8: c3 83 c2 b1 
    UnicodeString us = "ñ";     // results in good UTF-8: c3 b1  
    std::string cs; 
    us.toUTF8String(cs); 
    std::cout << cs; // output result to file, i.e.: main >output.txt 

}

내가 사용하고 VC++ 2013

+0

플랫폼의 기본이 적용됩니다

당신은 데이터가 UTF-8, 예를 들어 알고 UnicodeString을 수 있도록 생성자 호출을 변경해야 코드 페이지. ''''''''''''''''''''''''''''''''''''은 소스 코드의 charset의 대상이됩니다. 소스 코드가 UTF-8입니까? 그것은 당신의 나쁜 전환을 설명 할 수 있습니다. 원본 데이터를 UTF-8로 지정하여 올바르게 변환되도록하는 UnicodeString 생성자를 사용해야합니다. –

+0

예, 소스가 UTF-8 형식입니다. –

답변

6

를 사용하고하는 UTF-8, 당신은 UnicodeString에 그런 말 할 필요가있다. 그것의 생성자는 그 목적을 위해 codepage 매개 변수를 가지고 있지만, 당신은 빈 문자열로 설정하는 : 당신이 원하는하지 않은, 불변 변환을 수행 UnicodeString을 알려줍니다

UnicodeString testString(testChars, ""); 

. 1 codepoint (U + 65AF) 대신 3 개의 코드 포인트 (U + 00E6 U + 0096 U + 00AF)로 끝나기 때문에 루프가 3 번 반복됩니다. 은`UnicodeString` 생성자에 그 자체로`숯불 *를`통과

UnicodeString testString(testChars, "utf-8"); 
+0

와우, 고마워요 레미, 이건 제가 생각조차하지 못했던 것입니다. 수락하기 전에 내 문제를 해결하기 위해 제안을 실험 할 것입니다. –