web-dev-qa-db-ja.com

Visual Studioの「文字セット」オプションについて

Visual Studioの「文字セット」オプションについて質問があります。文字セットオプションは次のとおりです。

  • 設定されていません
  • Unicode文字セットを使用
  • マルチバイト文字セットを使用

文字セットの3つのオプションの違いは何ですか?

また、それらのいずれかを選択した場合、英語以外の言語(RTL言語など)のサポートに影響しますか?

27
Lion King

これは互換性設定であり、Unicode対応ではない古いバージョンのWindows用に作成されたレガシーコードを対象としています。 Windows 9xファミリのバージョンであるWindows MEは、最後の広く無視されたバージョンでした。 「Not Set」または「Use Multi-Byte Character Set」を選択すると、引数として文字列を受け取るすべてのWindows API関数が、_char*_文字列を_wchar_t*_文字列に変換する小さな互換性ヘルパー関数に再定義されます、APIのネイティブ文字列型。

このようなコードは、デフォルトのシステムコードページ設定に大きく依存します。コードページは、フォントグリフを選択するUnicodeに8ビット文字をマップします。コードを実行するマシンに正しいコードページがある場合にのみ、プログラムは正しいテキストを生成します。コードページが一致しない場合、値が128以上の文字は正しくレンダリングされません。

最新のコードでは、常に「Use Unicode Character Set」を選択してください。特に、右から左へのレイアウトで言語をサポートする必要があり、開発マシンでアラビア語またはヘブライ語のコードページが選択されていない場合。コードでは_std::wstring_または_wchar_t[]_を使用します。実際のRTLレイアウトを取得するには、CreateWindowEx()呼び出しで_WS_EX_RTLREADING_スタイルフラグをオンにする必要があります。

27
Hans Passant

ハンスはすでに質問に回答していますが、これらの設定には不思議な名前があることがわかりました。 (正確には何が設定されておらず、なぜ他の2つのオプションが非常に似ているのですか?)それについて:

  • ここでの「Unicode」は、特にMicrosoft-speak for CS-2 encodingです。これは、Hansによって記述された、コードページに依存しない推奨です。 _UNICODEと呼ばれる対応するC++ #defineフラグがあります。
  • "マルチバイト文字セット"(別名MBCS)は、以前の国際的なテキストエンコーディングスキームを説明するためのMicrosoftの公式フレーズです。 Hansが説明したように、さまざまな言語を説明するさまざまなMBCSコードページがあります。エンコーディングは「マルチバイト」であり、一部またはすべての文字が複数バイトで表される場合があります。 (一部のコードページは、UTF-8に似た可変長エンコーディングを使用します。)通常のコードページは、すべてのASCII文字をそれぞれ1バイトとして表します。対応するC++ #defineフラグが呼び出されます_MBCS
  • 「設定されていません」とは、_UNICODEや_MBCSが#definedでコンパイルされていることを指します。この場合、Windowsは文字エンコードごとに厳密に1バイトで動作します。 (この場合も、いくつかの異なるコードページが利用可能です。)

WindowsでのMBCSとUTF-8の違い では、これらの問題について詳しく説明しています。

12
Chris