5

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.
4

3 に答える 3

9

sizeof(s2)s2ポインターまたはその他のポインターを格納するために必要なバイト数を返します。これは、システムでは 4 バイトです。が指す に格納されている文字とは関係ありませんs2

于 2012-07-16T12:07:54.153 に答える
4

sizeof(wchar_t*)と同じ、sizeof(void*)つまりポインタ自体のサイズです。32 ビット システムでは常に 4、64 ビット システムでは 8 になります。wcslen()またはlstrlenW()の代わりに使用する必要がありますsizeof()

const wchar_t* s1 = L"a"; 
const wchar_t* s2 = L"\U0002008A"; // The "Han" character 

int i1 = sizeof(wchar_t); // i1 == 2
int i2 = wcslen(s1); // i2 == 1
int i3 = wcslen(s2); // i3 == 2
于 2012-07-17T01:57:35.117 に答える
0

回答の補足。RE:とによる質問の更新で
使用されているさまざまな単位を解明します。 i1i2i3

i1値 2 はバイト単位
i2のサイズ、値 1 はwchar_t単位のサイズ、IOW 4 バイト (4 と仮定sizeof(wchar_t)) です。
i3値 2 はwchar_tのサイズ、IOW 8 バイト

于 2013-05-31T18:24:38.263 に答える