今さら聞けない、教えてもらえない!! Unicode /マルチバイト文字対応 国際化VC ++ プログラミングの基礎!!
皆様、こんにちは。PlatformSDK (Windows SDK) サポートの shfujita です。
ついに今年も残すところあとわずかとなりました。
2011 年の締めくくりに「Unicode とマルチバイト文字」についてお話したいと思います。
本題に入る前に、"Unicode 文字セット" と "マルチバイト文字セット" とは何かご存知でしょうか。
まずは "Unicode" と"マルチバイト" とは何ぞや!?ということからお話したいと思います。
Unicode 文字セットとは、1993 年に ISO の 1 つとして定められた文字コード規格で、当初は 2 バイト文字で世界中の文字を表そうとしたのですが、現在は 4 バイト文字まで対応するようにしています。規格当初の 2 バイト文字は UCS-2、4 バイトまで拡張したものは UCS-4 と呼ばれています。プログラム上で Unicode はワイド文字として扱われています。
マルチバイト文字セット (Multi-Byte Charcter Sets : MBCS) とは、「多バイト文字」と表現されて「2 バイト以上の文字」を指すこともありますが、MSDN の規定では「1 バイトおよび 2 バイト文字」となっております。シングルバイト文字もダブルバイト文字もマルチバイト文字に含まれます。Shift-JIS はここに含まれます。
ここからいよいよ本題です。
Unicode として文字を扱う場合とマルチバイトとして文字を扱う場合は文字の ”型” が異なります。
しかし、文字セットの種類を気にせずに使用できる “型” がございます。
それは・・・
「TCHAR 型、LPCTSTR 型、LPTSTR 型」です。
TCHAR 型、LPCTSTR 型、LPTSTR 型は Visual Studio 2005 ( Visual C++ 2005 ) 以降のバージョンでビルドする際、Unicode ビルドを選択いたしますとワイド文字型を指定しなくても自動的にワイド文字型として扱われ、MBCS (マルチバイト) ビルドを選択いたしますと自動的に char 型として扱われます。
「Unicode 文字セットを使用する」に設定している場合
・ TCHAR = WCHAR
・ LPCTSTR = const WCHAR*
・ LPTSTR = WCHAR*
「マルチバイト文字セットを使用する」に設定している場合
・ TCHAR = char
・ LPCTSTR = const char*
・ LPTSTR = char*
下記に Visual Studio 2010 ( Visual C++ 2010 ) での文字セットの設定方法をご案内いたします。
<Visual Studio 2010 での文字セットの設定方法>
1. [プロジェクト] メニューの [プロパティ] からプロジェクトの設定画面を開きます。
2. [構成プロジェクト] をクリックして下記の画面を開きます。
3. [プロジェクト規定値] 配下の [文字セット] のタブを開きます。ここで文字セットを選択します。ここで [設定なし] を選択すると既定で設定されている " Unicode 文字セット" となります。
<参考情報>
Unicode とマルチバイト文字セット (MBCS: Multibyte Character Set) のサポート
https://msdn.microsoft.com/ja-jp/library/ey142t48.aspx#_core_mfc_support_for_mbcs_strings
最後に Unicode とマルチバイト両方で通用する記載方法をご案内します。
* TCHAR を例とします。
TCHAR * text = _T("Hello!!");
_tprintf( _T("%s"), Text );
上記のように、表示したい文字列 "Hello!!" を _T() 内に記載します。
printf にも _t をつけます。
いかかでしょうか?
かつて、プログラミングはマルチバイト文字を使用することが主流でしたが、現在は国際化プログラミングにおいては Unicode 文字を使用することが主流となっています。マルチバイト文字から Unicode 文字に移行する際に文字セットの種類を気にせずに使用できる型 (TCHAR 型、LPCTSTR 型、LPTSTR 型) の利用が推奨された時期がありましたが、現在でもライブラリなど用途によって文字セットを切り替える場合に有効です。Unicode 文字セットとマルチバイト文字セットは通常可逆変換ではありませんが、メモリ効率を気になさる場合や今後の Unicode 対応に備えておきたい場合など、ぜひ利用を検討いただければと思います。
年の瀬のとなりましたが、皆様は何かやり残したことなどございませんでしょうか?
私は積み残しが嫌いな性格なので今年できることは今年のうちに片付けて、来年は新しい気持ちでいろいろなことにチャレンジしたいと思っております。
皆様にとっても 2012 年はよい年になりますように!!