次の方法で共有


文字列の操作

このトピックでは、Windows が UI 要素やファイル名などの Unicode 文字列をサポートする方法について説明します (Unicode はすべての文字セットと言語をサポートするため、推奨される文字エンコードです)。

Windows は UTF-16 エンコードを使用する Unicode 文字を表し、各文字は 1 つまたは 2 つの 16 ビット値としてエンコードされます。 8 ビットの ANSI 文字と区別するために、UTF-16 文字は ワイド 文字と呼ばれます。 Visual C++ コンパイラは、ワイド文字の組み込みのデータ型 wchar_t をサポートしています。 ヘッダー ファイル WinNT.h は、次の typedef も定義します。

typedef wchar_t WCHAR;

ワイド文字リテラルまたはワイド文字文字列リテラルを宣言するには、リテラルの前に L を配置します。

wchar_t a = L'a';
wchar_t *str = L"hello";

次の表に、その他の文字列関連の typedef を示します。

Typedef Definition
CHAR char
PSTR または LPSTR char*
PCSTR または LPCSTR const char*
PWSTR または LPWSTR wchar_t*
PCWSTR または LPCWSTR const wchar_t*

Unicode 関数と ANSI 関数

Microsoft が Windows に Unicode サポートを導入した際、ANSI 文字列用と Unicode 文字列用の 2 つの並列 API セットを提供することで、移行を容易にしました。 たとえば、ウィンドウのタイトル バーのテキストを設定する 2 つの関数があります。

  • SetWindowTextA は ANSI 文字列を受け取ります。
  • SetWindowTextW は Unicode 文字列を受け取ります。

内部的には、ANSI バージョンでは文字列が Unicode に変換されます。 Windows ヘッダーでは、プリプロセッサ シンボル UNICODE が定義されている場合は Unicode バージョンに解決されるマクロ、それ以外の場合は ANSI バージョンが定義されます。

#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif 

この関数は、実際の関数名ではなく、マクロ名 SetWindowText という名前で記述されています。

新しいアプリケーションでは、常に Unicode バージョンを呼び出す必要があります。 多くの世界言語には Unicode が必要です。 ANSI 文字列を使用すると、アプリケーションをローカライズできなくなります。 また、オペレーティング システムでは実行時に ANSI 文字列を Unicode に変換する必要があるため、ANSI バージョンの方が効率が低いです。 好みに応じて、SetWindowTextW などの Unicode 関数を明示的に呼び出すか、マクロを使用できます。 最新の Windows API には通常、Unicode バージョンだけが含まれます。

TCHARs

場合によっては、ターゲット プラットフォームに応じて、ANSI 文字列または Unicode 文字列に対して同じコードをコンパイルすると便利な場合があります。 このため、Windows SDK には、プラットフォームに応じて文字列を Unicode または ANSI にマップするマクロが用意されています。

マクロ Unicode ANSI
TCHAR wchar_t char
TEXT("x") または _T("x") L"x" "x"

コード例を次に示します。

SetWindowText(TEXT("My Application"));

次のいずれかに解決されます。

SetWindowTextW(L"My Application"); // Unicode function with wide-character string.

SetWindowTextA("My Application");  // ANSI function.

TEXT および TCHAR マクロは、すべてのアプリケーションで Unicode を使用する必要があるため、現在はあまり役に立ちません。

Microsoft C ランタイム ライブラリのヘッダーは、同様のマクロ セットを定義します。 たとえば、_tcslen が未定義の場合は strlen に解決されます。それ以外の場合は、strlen のワイド文字バージョンである _UNICODEwcslen に解決されます。

#ifdef _UNICODE
#define _tcslen     wcslen
#else
#define _tcslen     strlen
#endif 

注意: 一部のヘッダーはプリプロセッサ シンボル UNICODEを使用し、他のヘッダーはアンダースコア プレフィックスを持つ _UNICODE を使用します。 常に両方のシンボルを定義します。 Visual C++ では、新しいプロジェクトを作成するときに両方が既定で設定されます。

次へ

ウィンドウとは