文字コード分かんないですよ?
C#と文字列をやり取りするところで、平然とstd::stringをつかっていたら、いやそれ大丈夫なん?とつっこまれてきょとんとしたPosauneです。こんばんわ。
C++は文字コードマジで複雑怪奇ですよね。なんだよLPCTSTRって。Long Pointer Const String?わかんないよまじで。
というわけで、英語の勉強兼ねて、読んでみましょう、
Tがつくメソッドをつかってたら、まま幸せになれるらしい。
VCコンパイラがサポートする文字型がcharとwchar_tだそうです。んで、これは一応標準型。なので標準型をそのまんま使わずに使うべきなのはTCHAR。なぜならば。
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
こう解釈されて、コンパイラスイッチにより変更できるので。ていうかUnicodeを使うってするだけではどうしようもならないんすねこれ。むー。
同様に、コピーや文字結合なども_tが入っているメソッドを使いなさいよ、と。
- strcpy -> _tcscpu
- strlen -> _tcslen
- strcat -> _rcscat
ちなみに、_tとかTは“Template”から来ているそうな。確かに型を外部から切り替えられるのはTemplateっぽいけれど。
ちなみに、MessageBoxAとかついてる“A”はANSIの“A”だそうな。だから尽くAがついているのか。あそこら辺のAPI。
普通に文字列を作ったら、ANSI。
文字列を以下のように定義したとしましょう。
"ANSI String";
L"UNICODE String";
コレも当然、
_T("Either string, depending on compilation");
適切な型をコンパイルスイッチで判断するわけです。
LPCTSTRにも意味はあるのね。
LP〜系は、結局上に見てきたchar文字のポインタを指す、文字列集合となります。だので、変換元と先はこんな感じ。
- char* replacement: LPSTR
- const char* replacement: LPCSTR
- WCHAR* replacement: LPWSTR
- const WCHAR* replacement: LPCWSTR (C before W, since const is before WCHAR)
- TCHAR* replacement: LPTSTR
- const TCHAR* replacement: LPCTSTR
うむ。大体わかった。