2011-09-28 136 views
5

我知道,在C得到一個Unicode字符++我可以這樣做:如何遍歷C++中的unicode字符?

std::wstring str = L"\u4FF0"; 

但是,如果我想獲得在5FF0的範圍4FF0所有字符是什麼?是否有可能動態構建一個Unicode字符?我想到的是這樣的僞代碼:

for (int i = 20464; i < 24560; i++ { // From 4FF0 to 5FF0 
    std::wstring str = L"\u" + hexa(i); // build the unicode character 
    // do something with str 
} 

我會怎麼做,在C++?

回答

9

一的wstring內舉行的wchar_t的類型是整型的,這樣你就可以直接使用它:

for (wchar_t c = 0x4ff0; c <= 0x5ff0; ++c) { 
    std::wstring str(1, c); 
    // do something with str 
} 

要小心,試圖與上述0xFFFF的字符,要做到這一點,因爲根據不同的平臺(如Windows)他們將不適合wchar_t。

例如,如果你想看看Emoticon block在一個字符串,您可以創建代理對:

std::wstring str; 
for (int c = 0x1f600; c <= 0x1f64f; ++c) { 
    if (c <= 0xffff || sizeof(wchar_t) > 2) 
     str.append(1, (wchar_t)c); 
    else { 
     str.append(1, (wchar_t)(0xd800 | ((c - 0x10000) >> 10))); 
     str.append(1, (wchar_t)(0xdc00 | ((c - 0x10000) & 0x3ff))); 
    } 
} 
+0

有沒有簡單的解決方案Codepoints> 0xffff? –

+1

@Captain長頸鹿,如果你的wchar_t類型大於16位,這將是沒有問題的。否則,您必須根據[UTF-16](http://en.wikipedia.org/wiki/Utf-16)規則將其分成兩個wchar_t字符。 –

+1

如果今天是昨天,那麼這個類型應該被稱爲字節,而不是char =)另外,「word」會在腦海中浮現 –

2

什麼:

for (std::wstring::value_type i(0x4ff0); i <= 0x5ff0; ++i) 
{ 
    std::wstring str(1, i); 
} 

注意,代碼沒有經過測試,所以它可能不會編譯原樣。

此外,考慮到您正在使用的平臺上的wstring的字符單元可能是2,4或N個字節寬,所以請謹慎使用它。

+0

用'value_type'替換'char_type',它會編譯。 – Cubbi

+0

@Cubbi:完成,謝謝。 – fbrereto

4

不能超過Unicode字符遞增,如果它是一個數組,一些字符是建立出來的多個'char'(UTF-8)和多個'WCHAR'(UTF-16),這是因爲符號等。如果你真的認真對待這個東西,你應該使用像UniScribe或ICU這樣的API。

一些資源來閱讀:

http://en.wikipedia.org/wiki/UTF-16/UCS-2

http://en.wikipedia.org/wiki/Precomposed_character

http://en.wikipedia.org/wiki/Combining_character

http://scripts.sil.org/cms/scripts/page.php?item_id=UnicodeNames#4d2aa980

http://en.wikipedia.org/wiki/Unicode_equivalence

http://msdn.microsoft.com/en-us/library/dd374126.aspx

+1

第一個說法是正確的;原因不是。 UTF-8和UTF-16是編碼,並且與碼點正交。變音符號也是代碼點,所以它們獨立於UTF-8和-16 – MSalters