質問

C ++ 2003 2.13から

文字通りの広い文字列にはタイプがあります。n const wchar_tの配列」と静的ストレージ期間があり、nは以下に定義されている文字列のサイズです

文字通りの広い文字列のサイズは、エスケープシーケンスの総数、ユニバーサルキャラクター名、およびその他の文字と、終了l ' 0'用の1つです。

C ++から0x 2.14.5から

文字通りの広い文字列にはタイプがあります。n 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とは異なります。

Windowsがwchar_tをどのように実施するかを明確に述べる投稿があります https://stackoverflow.com/questions/402283?tab=votes%23tab-top

要するに、WindowsのWCHAR_Tは16ビットで、UTF-16を使用してエンコードされています。標準の声明は、明らかに窓に矛盾するものを残しているようです。

例えば、

wchar_t kk[] = L"\U000E0005";

これは16ビットを超え、UTF-16の場合、それをエンコードするには2つの16ビットが必要です(代理ペア)。

ただし、標準から、KKは2 WCHAR_Tの配列です(Universal-Name u000e005の場合は1、1は1)。

ただし、内部ストレージでは、Windowsが36ビットWCHAR_Tオブジェクトを保存する必要があります。Surrogateペアには2 WCHAR_T、 0に1 WCHAR_Tが必要です。したがって、配列の定義から、KKは3 WCHAR_Tの配列です。

それはどうやら互いに矛盾しているようです。

Windowsの最も簡単なソリューションの1つは、WCHAR_T(BMP以外のユニコードを「禁止」)でサロゲートペアを必要とするものを「禁止」することだと思います。

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

ありがとう。

役に立ちましたか?

解決

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

BMP以外の文字はめったに使用されず、Windows自体はUTF-16エンコーディングを内部的に使用するため、VC ++がこのように動作するのは(間違っていても)単純に便利です。ただし、そのようなキャラクターを「禁止」するのではなく、 wchar_t 将来的には増加します char16_t Windows APIでその代わりになります。

あなたがリンクした答えは、やや誤解を招くものでもあります。

Linuxで、a wchar_t 4バイトですが、Windowsでは2バイトです

サイズ wchar_t コンパイラのみに依存しており、オペレーティングシステムとは何の関係もありません。 VC ++が2バイトを使用していることがあります wchar_t, 、しかし、もう一度、これは将来的に非常に変化する可能性があります。

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top