7

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を「禁止」する)。

私の理解に何か問題がありますか?

ありがとう。

4

2 に答える 2

4

標準wchar_tでは、サポートされている文字セット内の任意の文字を保持するのに十分な大きさである必要があります。これに基づいて、あなたの前提は正しいと思います。VC++が2つの単位\U000E0005を使用して1つの文字を表すのは間違っています。wchar_t

BMPの外部の文字が使用されることはめったになく、Windows自体は内部でUTF-16エンコーディングを使用するため、VC ++がこのように動作するのは(正しくない場合でも)単純に便利です。ただし、そのような文字を「禁止」するのではなく、Windows APIでの使用wchar_t中に、サイズが将来的に大きくなる可能性があります。char16_t

あなたがリンクした答えもやや誤解を招きます:

Linuxではawchar_tは4バイトですが、Windowsでは2バイトです。

のサイズはwchar_tコンパイラのみに依存し、オペレーティングシステムとは関係ありません。VC ++がに2バイトを使用するのはたまたまですがwchar_t、これも将来的には非常によく変わる可能性があります。

于 2010-12-08T06:53:19.143 に答える
2

wchar_tはプログラミングの概念であるため、Windowsはwchar_tについて何も知りません。逆に、wchar_tは単なるストレージであり、格納するデータのセマンティック値については何も知りません(つまり、UnicodeやASCIIなどについては何も知りません)。

Windowsを対象とするコンパイラまたはSDKがwchar_tを16ビットと定義している場合、そのコンパイラはC++0x標準と競合している可能性があります。(wchar_tを16ビットにすることができるget-out句があるかどうかはわかりません。)しかし、いずれの場合でも、コンパイラはwchar_tを32ビット(標準に準拠するため)に定義し、に変換するランタイム関数を提供できます。 /wchar_t*をWindowsAPIに渡す必要がある場合のUTF-16から。

于 2010-12-08T07:49:11.000 に答える