c++2003から2.13
ワイド文字列リテラルのタイプは「<strong>arrayofn const wchar_t」であり、静的ストレージ期間があります。ここで、nは以下に定義されている文字列のサイズです。
ワイド文字列リテラルのサイズは、エスケープシーケンス、ユニバーサル文字名、およびその他の文字の総数に、終了するL'\0'の1つを加えたものです。
c ++0x2.14.5から
ワイド文字列リテラルのタイプは「<strong>arrayofn const wchar_t」です。ここで、nは以下に定義されている文字列のサイズです。
char32_tまたはワイド文字列リテラルのサイズは、エスケープシーケンス、ユニバーサル文字名、およびその他の文字の総数に、終了するU'\0'またはL'\0'の1つを加えたものです。
char16_t文字列リテラルのサイズは、エスケープシーケンス、ユニバーサル文字名、およびその他の文字の総数に、サロゲートペアを必要とする各文字に1つ、および終了u'\0'に1つを加えたものです。
C++2003の記述はかなりあいまいです。ただし、C ++ 0xでは、文字列の長さをカウントする場合、ワイド文字列リテラルwchar_tはchar32_tと同じように扱われ、char16_tとは異なります。
https://stackoverflow.com/questions/402283?tab=votes%23tab-topにWindowsがwchar_tを実装する方法を明確に述べた投稿があります
つまり、Windowsのwchar_tは16ビットであり、UTF-16を使用してエンコードされます。標準のステートメントは、明らかにWindowsで何か矛盾するものを残しています。
例えば、
wchar_t kk[] = L"\U000E0005";
これは16ビットを超えており、UTF-16の場合、エンコードするには2つの16ビットが必要です(サロゲートペア)。
ただし、標準では、kkは2つのwchar_tの配列です(ユニバーサル名\ U000E005の場合は1、\ 0の場合は1)。
ただし、内部ストレージでは、Windowsはそれを格納するために3つの16ビットwchar_tオブジェクト、代理ペア用に2つのwchar_t、および\0用に1つのwchar_tを必要とします。したがって、配列の定義から、kkは3つのwchar_tの配列です。
どうやら互いに矛盾しているようです。
Windowsの最も簡単な解決策の1つは、wchar_tでサロゲートペアを必要とするものをすべて「禁止」することです(BMP外のUnicodeを「禁止」する)。
私の理解に何か問題がありますか?
ありがとう。