2011-09-28 29 views
5

は、私はC言語でUnicode文字を取得するために知っ++私が行うことができます。C++でユニコード文字を反復処理する方法は?

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

しかし、私は5FF0の範囲4FF0のすべての文字を取得するために何をしたい場合は?ユニコード文字を動的に構築することは可能ですか?私が覚えていることは、この擬似コードのようなものです:

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

コードポイント> 0xffffの簡単なソリューションはありますか? –

+1

@Captain Giraffe、あなたのwchar_tタイプが16ビットより大きい場合は問題ありません。それ以外の場合は、[UTF-16](http://en.wikipedia.org/wiki/Utf-16)の規則に従って2つの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

'char_type'を' value_type'に置き換えてコンパイルします。 – Cubbi

+0

@Cubbi:完了、ありがとう。 – fbrereto

4

それが配列であるかのようにあなたは、いくつかの文字が外に構築され、Unicode文字の上にインクリメントすることはできません(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

関連する問題