Visual Studio コンパイラ (C++ 用) には、MBCS と UNICODE という 2 つのコンパイラ フラグがあることに気付きました。それらの違いは何ですか?
char
Windows API の多くの関数には、パラメーターを受け取るバージョン (ロケール固有のコード ページ) とパラメーターを受け取るバージョンwchar_t
(UTF-16) の2 つのバージョンがあります。
int MessageBoxA(HWND hWnd, const char* lpText, const char* lpCaption, unsigned int uType);
int MessageBoxW(HWND hWnd, const wchar_t* lpText, const wchar_t* lpCaption, unsigned int uType);
これらの各関数ペアには、UNICODE
マクロが定義されているかどうかに応じて、サフィックスのないマクロもあります。
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
これを機能させるために、TCHAR
型を定義して、API 関数で使用される文字型を抽象化します。
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
しかし、これは悪い考えでした。文字タイプは常に明示的に指定する必要があります。
私が得ていないのは、UTF-8 が MBCS エンコーディングと概念的にどのように異なるかということです。
MBCS は「マルチバイト文字セット」の略です。文字通り気にする人にとっては、UTF-8が適格であるように思われます。
ただし、Windows では、「MBCS」は、Windows API 関数の「A」バージョンで使用できる文字エンコーディングのみを指します。これには、コード ページ 932 (Shift_JIS)、936 (GBK)、949 (KS_C_5601-1987)、および 950 (Big5) が含まれますが、UTF-8は含まれません。
UTF-8 を使用するには、 を使用して文字列を UTF-16 に変換しMultiByteToWideChar
、関数の "W" バージョンを呼び出しWideCharToMultiByte
、出力に対して を呼び出す必要があります。これは本質的に "A" 関数が実際に行うことであり、なぜ Windows が UTF-8 をサポートしていないのか疑問に思います。
最も一般的な文字エンコーディングをサポートできないため、Windows API の "A" バージョンは役に立たなくなります。したがって、常に「W」関数を使用する必要があります。
Unicode は 16 ビットの文字エンコーディングです
これは、私がユニコードについて読んだことを否定します。
MSDN が間違っています。Unicode は 21 ビットでコード化された文字セットであり、いくつかのエンコーディングがあり、最も一般的なものは UTF-8、UTF-16、および UTF-32 です。(GB18030、UTF-7、UTF-EBCDIC など、他の Unicode エンコーディングもあります。)
Microsoft が「Unicode」と呼ぶときはいつでも、実際には UTF-16 (または UCS-2) を意味します。これは歴史的な理由によるものです。Windows NT は Unicode の初期の採用者であり、当時は 16 ビットで十分であると考えられていました。UTF-8 は Plan 9 でのみ使用されていました。したがって、UCS-2はUnicode でした。