내 목표는 문자하지만 아래의 코드로 유니 코드 텍스트 문자의 문자열을 반복하는 것입니다 내가 코드를 반복하도록되어 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
플랫폼의 기본이 적용됩니다
당신은 데이터가 UTF-8, 예를 들어 알고
UnicodeString
을 수 있도록 생성자 호출을 변경해야 코드 페이지. ''''''''''''''''''''''''''''''''''''은 소스 코드의 charset의 대상이됩니다. 소스 코드가 UTF-8입니까? 그것은 당신의 나쁜 전환을 설명 할 수 있습니다. 원본 데이터를 UTF-8로 지정하여 올바르게 변환되도록하는 UnicodeString 생성자를 사용해야합니다. –예, 소스가 UTF-8 형식입니다. –