亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

VCにおける文字コード問題。(あれ?stdの話スルーしちゃった?)

文字コード分かんないですよ?

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";

これは、ANSIです。UNICODEにするには、

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


うむ。大体わかった。