67

Windowsの文字セットとエンコーディングについて読んでいます。Visual Studioコンパイラ(C ++用)には、MBCSとUNICODEという2つのコンパイラフラグがあることに気付きました。それらの違いは何ですか?私が得ていないのは、UTF-8がMBCSエンコーディングと概念的にどのように異なるかということです。また、MSDNで次の引用を見つけました:

Unicodeは16ビット文字エンコーディングです

これは私がUnicodeについて読んだものをすべて否定します。Unicodeは、UTF-8やUTF-16などのさまざまなエンコーディングでエンコードできると思いました。誰かがこの混乱にもう少し光を当てることができますか?

4

4 に答える 4

113

Visual Studio コンパイラ (C++ 用) には、MBCS と UNICODE という 2 つのコンパイラ フラグがあることに気付きました。それらの違いは何ですか?

charWindows 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-2Unicode でした。

于 2010-07-21T13:42:11.837 に答える
18
于 2012-10-22T12:14:45.080 に答える
12

MBCSマルチバイト文字セットを意味し、文字が (場合によっては) 1 バイト以上にエンコードされる任意の文字セットを表します。

ANSI / ASCII文字セットはマルチバイトではありません。

ただし、 UTF-8はマルチバイト エンコーディングです。Unicode 文字を 1、2、3、または 4 オクテット (バイト) のシーケンスとしてエンコードします。

ただし、UTF-8 は、Unicode 文字セットのいくつかの可能な具体的なエンコーディングのうちの 1 つにすぎません。特に、UTF-16 は別のエンコーディングであり、たまたま Windows / .NET (IIRC) で使用されるエンコーディングです。UTF-8 と UTF-16 の違いは次のとおりです。

  • UTF-8 は、任意の Unicode 文字を 1、2、3、または 4 バイトのシーケンスとしてエンコードします。

  • UTF-16 は、ほとんどの Unicode 文字を 2 バイトでエンコードし、一部は 4 バイトでエンコードします。

したがって、Unicode が 16 ビット文字エンコーディングであることは正しくありません。これは、21 ビット エンコーディングのようなものです (または、最近ではさらに多くなっていますU+000000) U+10FFFF

于 2010-07-21T11:17:52.257 に答える