Windows 8 で興味深い問題が発生しました。BMP に含まれていない Unicode 文字を wchar_t* 文字列で表現できることをテストしました。次のテスト コードは、予期しない結果をもたらしました。
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
int i2 = sizeof(s1); // i2 == 4, because of the terminating '\0' (I guess).
int i3 = sizeof(s2); // i3 == 4, why?
U+2008A は、バイナリ多言語ペインの外にある漢字なので、UTF-16 のサロゲート ペアで表す必要があります。つまり、正しく理解できれば、2 つの wchar_t 文字で表す必要があります。したがって、sizeof(s2) は 6 (サロゲート ペアの 2 つの wchar_t-s に対して 4、終了 \0 に対して 2) であると予想しました。
では、なぜ sizeof(s2) == 4 なのですか? DirectWrite でレンダリングしたため、s2 文字列が正しく構築されていることをテストしたところ、漢字が正しく表示されました。
更新: Naveen が指摘したように、配列のサイズを誤って決定しようとしました。次のコードは正しい結果を生成します。
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
std::wstring str1 (s1);
std::wstring str2 (s2);
int i2 = str1.size(); // i2 == 1.
int i3 = str2.size(); // i3 == 2, because two wchar_t characters needed for the surrogate pair.