TCHAR はまだ関連していますか?

短い答え:いいえ .

他のすべての人が既に書いたように、多くのプログラマーは今でも TCHAR とそれに対応する関数を使用しています。私の謙虚な意見では、全体のコンセプトは悪い考えでした . UTF-16 文字列処理は、単純な ASCII/MBCS 文字列処理とは大きく異なります。両方で同じアルゴリズム/関数を使用する場合 (これが TCHAR の考え方の基になっています!)、UTF-16 バージョンでは、単純な文字列連結 (解析など)。主な理由はサロゲートです。

本当に Unicode をサポートしないシステム用にアプリケーションをコンパイルする必要があります。新しいアプリケーションで過去からのこの荷物を使用する理由がわかりません。


私はサーシャに同意しなければなりません。 TCHAR の前提 / _T() / などは、「ANSI」ベースのアプリケーションを作成し、マクロを定義することで魔法のように Unicode サポートを提供できることです。しかし、これはいくつかの悪い仮定に基づいています:

ソフトウェアの MBCS バージョンと Unicode バージョンの両方を積極的に構築していること

そうでなければ、あなたはする 間違えて普通の char* を使う

_T("...") リテラルで非 ASCII バックスラッシュ エスケープを使用しない

「ANSI」エンコーディングがたまたま ISO-8859-1 でない限り、結果の char*wchar_t* リテラルは同じ文字を表しません。

UTF-16 文字列が「ANSI」文字列と同じように使用されること

そうではありません。 Unicode には、ほとんどの従来の文字エンコーディングには存在しないいくつかの概念が導入されています。サロゲート。文字を組み合わせます。正規化。条件付きで言語に依存する大文字と小文字の規則。

そしておそらく最も重要なのは、UTF-16 がディスクに保存されたり、インターネット経由で送信されたりすることはめったにないという事実です。UTF-8 は外部表現に好まれる傾向があります。

アプリケーションがインターネットを使用しないこと

(これは、あなたのにとって有効な仮定かもしれません ソフトウェアですが...)

Web は UTF-8 と多数のまれなエンコーディングで実行されます。 TCHAR この概念は、"ANSI" (これはできません) の 2 つだけを認識します。 UTF-8) および「Unicode」(UTF-16) である必要があります。 Windows API 呼び出しを Unicode 対応にするのには役立つかもしれませんが、Web アプリや電子メール アプリを Unicode 対応にするのにはまったく役に立ちません。

Microsoft 以外のライブラリを使用していないこと

誰も TCHAR を使用していません . Poco は std::string を使用します そしてUTF-8。 SQLite には UTF-8 および UTF-16 バージョンの API がありますが、TCHAR はありません . TCHAR 標準ライブラリにもないので std::tcout はありません 自分で定義したい場合を除きます。

TCHAR の代わりに私が推奨するもの

有効な UTF-8 ではないファイルを読み取る必要がある場合を除いて、「ANSI」エンコーディングが存在することを忘れてください。 TCHAR のことは忘れてください それも。常に Windows API 関数の "W" バージョンを呼び出します。 #define _UNICODE 誤って "A" 関数を呼び出さないようにするためです。

文字列には常に UTF エンコーディングを使用します:char には UTF-8 wchar_t の文字列および UTF-16 (Windows の場合) または UTF-32 (Unix 系システムの場合) 文字列。 typedef UTF16UTF32 プラットフォームの違いを避けるための文字タイプ。


まだ実際に使用されているかどうか疑問に思っている場合は、はい - まだかなり使用されています。 TCHAR と _T("") を使用している場合、誰もあなたのコードを面白いとは思わないでしょう。私が現在取り組んでいるプロジェクトは、ANSI から Unicode への変換であり、移植可能な (TCHAR) ルートに進んでいます。

しかし...

私の投票は、すべての ANSI/UNICODE 移植可能マクロ (TCHAR、_T("")、およびすべての _tXXXXXX 呼び出しなど...) を忘れて、どこでも unicode を想定することです。 ANSI バージョンがまったく必要ないのであれば、移植可能であることの意味がわかりません。すべてのワイド文字関数と型を直接使用します。すべての文字列リテラルの前に L を付けます。