5

私は C++ を学習している途中で、MSDN の記事に出くわしました:

http://msdn.microsoft.com/en-us/magazine/dd861344.aspx

最初のコード例では、私の質問に関連する 1 行のコードは次のとおりです。

VERIFY(SetWindowText(L"Direct2D Sample"));

より具体的には、L プレフィックスです。少し読んで、間違っていたら訂正してください :-) が、これは Unicode 文字列を許可するため、つまり長い文字セットを準備するためです。これを読んでいるときに、C の高度な文字列テクニックに関する別の記事に出くわしましたhttp://www.flipcode.com/archives/Advanced_String_Techniques_in_C-Part_I_Unicode.shtml

ヘッダーを含めるなど、いくつかのオプションがあると言われています。

#define UNICODE 

また

#define _UNICODE

C で、私が間違っている場合は再度指摘してください。フィードバックに感謝します。さらに、これらの Unicode 文字列に適したデータ型は次のとおりです。

wchar_t

マクロと一種のハイブリッド データ型を混在させます。マクロは次のとおりです。

_TEXT(t)

これは単に文字列の前に L とハイブリッド データ型を次のように付けます。

TCHAR 

ヘッダーが存在する場合はユニコードを許可し、そうでない場合はASCIIを許可します。ここで私の質問、または確認したい仮定の多くは、Microsoft がより柔軟なこの TCHAR データ型を使用するか、または wchar_t の使用にコミットする利点があるかということです。

また、Microsoft がこれを使用している、より具体的には ATL および WTL ライブラリの例であると私が言うとき、あなた自身の誰かがこれに関して好みやアドバイスを持っていますか?

乾杯、

アンドリュー

4

4 に答える 4

12

すべての新しいソフトウェアでは、UNICODE を定義し、wchar_t を直接使用する必要があります。ANSI strings を使用すると、再び悩まされます。

wchar_t とすべての CRT 関数のワイド バージョン (例: strcmp の代わりに wcscmp) を使用する必要があります。TEXT マクロや TCHAR などは、コードが ANSI と UNICODE の両方の環境で動作する必要がある場合にのみ存在しますが、コードはほとんど必要ないと感じています。

Visual Studio を使用して新しい Windows アプリケーションを作成すると、UNICODE が自動的に定義され、wchar_t がビルトインのように機能します。

于 2009-08-27T10:51:56.983 に答える
5

簡単な答え:TCHARタイプ、_TEXT()マクロ、およびさまざまな_t*機能 (_tcscpy思い付く) を備えたハイブリッド インフラストラクチャは、Microsoft が 2 つのプラットフォームを共存させていた時代への逆戻りです。

  1. Windows NT ラインは Unicode 文字列表現に基づいていました
  2. Windows 95/98/ME ラインは、ANSI 文字列表現に基づいていました。

ここでの文字列表現とは、アプリに文字列を期待または返したすべての Windows API が、これらの文字列に対していずれかの表現を使用したことを意味します。COM は両方のプラットフォームで利用可能であり、両方で Unicode 文字列を想定していたため、さらに混乱を招きました。

昔は、「移植可能な」コードを書くことが奨励されていました。アプリの UNICODE や _UNICODE を定義/定義解除するだけで両方のモデルをコンパイルできるように、文字列にハイブリッド インフラストラクチャを使用するように指示されていました。

Windows9x の行は (大部分のアプリにとって) 関連性がなくなったため、ANSI の世界を安全に無視して、Unicode 文字列を直接使用できます。

ただし、今日の Unicode には複数の表現があることに注意してください。上で指摘したように、wchar_t によって暗示される Unicode 規則は UCS-2 表現です (すべての文字は 16 ビット ワードでエンコードされます)。これが必ずしも真ではない、広く使用されている他の表現があります。

于 2009-08-27T11:00:46.187 に答える
2

Windows では、UTF-16 (2 バイト) エンコードの wchar_t です。

ソース: http://www.firstobject.com/wchar_t-string-on-linux-osx-windows.htm

于 2009-08-27T10:52:26.903 に答える
1

TCHAR は、UNICODE が定義されているかどうかに応じてその型を変更し、UNICODE および非 UNICODE 用にコンパイルできるコードが必要な場合に使用する必要があります。

UNICODE データのみを明示的に処理する場合は、wchar_t を自由に使用してください。

于 2009-08-27T10:52:57.560 に答える