ユニコードとMBCS(char、WCHAR)

MBCSとは

 普通、「A」という文字は「半角文字」と呼ばれる。また「A」は1バイトとして扱われている。 同じように「あ」という文字は「全角文字」で2バイトとして扱われる。このように同じ1文字で も1バイトと2バイトの文字が混在しているのが「MBCS(MultiByte Character Set)」だ。
 MBCSでは日本語を扱うことができる...と言うと語弊があるが「ABC」のような英語と日本語や中 国語、韓国語などで使われている文字を混在することができる。ただし混在できるのは基本的に1 つの言語のみとなる。例えばMBCSを使って日本語の平仮名とと韓国語のハングル文字を混在するこ とはできない。



ユニコードとは

 「ユニコード」というのは文字コードセットの1つ。英語と日本語や中国語などで使われている さまざまな文字を同時に扱える。

 MBCSでは「A」という文字は1バイトとして扱われている。しかしユニコードでは「A」という文 字であっても2バイトで扱われる。また「あ」という文字も同じように2バイトとして扱われる。 つまり常に1文字に必要なバイト数は同じになる。
 このようにユニコード文字は1文字が2バイトのため「ワイド文字」と呼ばれることもある。

※ユニコードでも世界で使われている全ての文字を扱えるわけではない
※ユニコードにもいくつかの種類がある。その種類によっては1文字2バイトとは限らない



charとWCHAR

 通常C言語では文字を表現する型として「char」、文字列は「char*」が使われる。
 この「char」で扱う文字は全て「MBCS」となる。つまり「char」ではユニコードを扱うことは できない。

 そのためユニコード文字を扱う型として「wchar_t」や「WCHAR」が用意されている
 また当然のことながらsizeof(char)は1バイトだが、sizeof(WCHAR)は2バイトとなる。

※ユニコードにもいくつかの種類がある。その種類によってはcharでもユニコードを扱える



ユニコードとMBCSの相互変換

 MBCS文字とユニコード文字の変換は単純にはできない。変換にはWideCharToMultiByteのような APIを利用することになる(具体的な変換例は別ページ参照)。

またユニコードとMBCSでは表現できる文字の"幅"が違うため変換できないこともある。例えるなら ばlong型からshort型への変換のようなものだ。long型は9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 までの数値を代入できる。しかしshort型は-32,768 ~ 32,767までだけであり、long型に大きい数 値が入っていた場合にはshortに代入できないためだ。これと同じ関係がMBCSとユニコードの間にも あることは頭の片隅に置いておくといいだろう。

カテゴリー「VC++ TIPS」 のエントリー