5

C ++でユニコード文字を取得するには、次のことができることを知っています。

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

しかし、4FF0 から 5FF0 の範囲のすべての文字を取得したい場合はどうすればよいでしょうか? ユニコード文字を動的に構築することは可能ですか? 私が念頭に置いているのは、次の擬似コードのようなものです。

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++でそれを行うにはどうすればよいですか?

4

3 に答える 3

9

wstring内に保持されているwchar_t型は整数型であるため、直接使用できます。

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

プラットフォーム(Windowsなど)によってはwchar_tに収まらないため、0xffffを超える文字でこれを行う場合は注意が必要です。

たとえば、文字列で絵文字ブロックを表示したい場合は、代理ペアを作成できます。

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)));
    }
}
于 2011-09-28T17:27:34.600 に答える
4

配列であるかのように Unicode 文字をインクリメントすることはできません。一部の文字は、複数の 'char's (UTF-8) および複数の 'WCHAR's (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

于 2011-09-28T18:34:43.333 に答える
2

どうですか:

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

コードはテストされていないため、そのままではコンパイルできない可能性があることに注意してください。

また、作業しているプラ​​ットフォームを考えると、wstringの文字単位は 2、4、または N バイト幅になる可能性があるため、使用方法について意図的に注意してください。

于 2011-09-28T17:25:23.943 に答える