- 追加された行はこの色です。
- 削除された行はこの色です。
Unicode文字とマルチバイト文字についてです
前回ではあえて触れませんでしたが
次のように打ってコンパイルしてください
#include <windows.h>
#include <windowsx.h>
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MessageBox(NULL,"Hello World","Msg Box",MB_OK);
return 0;
}
おそらく
error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [12]' から 'LPCWSTR' に変換できません。
というエラーが出るはずです
まずLPCWSTRって何よ?って話からです
LPC はポインタ(long const pointer)を意味しています
STR は文字列の意味です
「W」 がポイントでこれがUnicode文字を示しています
1文字を格納するのにいままで使っていたchar型は1バイトでした
つまり1文字1バイトです
それに対し、Unicode文字は
1文字を2バイトとして扱います
それにはwchar_t型という型を使います
つまり、「W」はwchar_tのwです
LPCWSTRを正式な書き方(?)で書くと
const wchar_t*
となります
で、さっきのエラーをもう一度みてみると
MessageBox関数を呼んだはずなのに
MessageBoxWと書いてあります
実はWin32APIは文字コードの設定で
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
のように内部で
MessageBoxA // マルチバイト文字用
MessageBoxW // Unicode文字用
と使う関数を切り分けているのです
他の文字列を使う関数に関しても同じような切り替えがされています
文字コードの設定は
プロジェクト→プロジェクトのプロパティから
&ref(Unicode.GIF);
を、次のように変更すると1文字をchar型として従来通り使えますが・・・
&ref(Multibyte.GIF);
個人的には、tchar.hをインクルードして
対応文字列関数を書くほうがよいと思います
C/C++マニアック雑記5
というのは、マルチバイト文字だと対応してない関数なども存在するからです
(大抵の場合は上記のように切り替えされてますが・・・)
なお文字列を_T("")で書けば、マルチバイト、Unicodeを意識しなくて済みます
#include <tchar.h>// マルチバイト文字とUnicode文字、相互互換文字列関数のヘッダー
#include <windows.h>
#include <windowsx.h>
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MessageBox(NULL,_T("Hello World"),_T("Msg Box"),MB_OK);
return 0;
}
#vote((^ω^)やったお[1],何これwww意味不すぎwww[0],。(`ω´#)。あぁん?最近、だらしねぇな[0])
|(^ω^)やったお|5|
|何これwww意味不すぎwww|1|
|。(`ω´#)。あぁん?最近、だらしねぇな|1|