やりたいこと
charとかwchar_tとか、文字列を扱う型が色々あって、なにをどういうときに使えば正しいのかよくわからないので知りたい。
文字列の種類
ワイド文字とは
1文字表現するのに2バイト用いる文字のこと。
Unicodeはこれ。
マルチバイト文字とは
1バイト以上の文字のこと。
SJISで日本語使う場合なんかはこれ。
型
char
- 文字列を扱う型。
- サイズは1バイト。
- 全角を扱うには、2バイト(char2つ分)が必要。
- charを複数つかう「マルチ」バイト文字を扱う。
- 文字列を初期化時に代入するには下記のようにする
.cpp
char buf[] = "abc";
wchar_t(WCHAR)
- 2バイトで1文字を表すunicode(ワイド文字)の文字列を扱う型。
- サイズは2バイト。
- 下記のように定義されている。
typedef unsigned short wchar_t;
typedef unsigned short WCHAR;
- ワイド文字列を扱うときは、文字列の前にLをつける(コンパイラにワイド文字であることを示す)。
wchar_t buf[] = L"abc";
TCHAR
- コンパイルオプションで通常とユニコードを切り替えできる型。
- 下記のように定義されている。
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
- 文字列を代入するときはこのようにする。
.cpp
TCHAR buf[] = _T("abc");
- _T("")は、プロジェクトの「文字セット」の設定によって、扱いが変わる。(詳しくは、こちらを参照)
.cpp
// 文字セットの設定により、このように動作する。
char buf[] = "abc"; // 設定なし
char buf[] = "abc"; // マルチバイト文字を使用する
wchar_t buf[] = L"abc"; // Unicode文字セットを使用する
メモ
- charからwchar_tにキャストして使ったり、その逆をしたりはできない。専用のAPIを使う必要がある。(mbstowcs_sなど)
- DLLを作ったときなど、char* をC#にそのまま渡すことはできない。マーシャリングや文字セットの指定など、いろいろややこしい。(こちらも参照)
参考
Visual C++ 文字列 まとめ
https://qiita.com/tadnakam/items/99d7c40670fb3649875d
めちゃくちゃわかりやすい、文字列を扱う型の解説
ここを見れば疑問はほぼ解決した。
文字列関連の標準関数
http://ytyaru.hatenablog.com/entry/2016/07/15/003402
char、wchar_t(WCHAR)とTCHAR
https://www.dinop.com/vc/char_wchar_tchar.html