MFCの基礎 - 文字列
概要
文字数の取得
文字セットがUnicodeまたはマルチバイトの場合において、文字列の文字数とバイト数を取得する。
ここで、以下に示す文字列を前提とする。
CString str = _T("123あいう"); // 文字列
int iLength; // 文字数
DWORD dwSize; // バイト数
上記の文字列の変数iLengthは"6"であるが、以下の例のように記述する場合、
変数iLengthは、Unicodeの場合"6"、マルチバイトの場合"9"となるため、マルチバイトの場合において目的の文字数が得ることができない。
iLength = str.GetLength();
VC++の標準関数であるwctomb_s
関数等を使用してもよいが、MFCではCStringW
クラスを使用することもできる。
以下の例のように記述することにより、マルチバイト、Unicodeともに変数iLengthは"6"となり、正常に文字数を取得することができる。
CStringW strw;
strw = str;
iLength = strw.GetLength();
※注意
CStringW
クラスのコンストラクタには、マルチバイトからUnicodeに変換する定義が無いため、宣言と同時に=
演算子で初期化することはできない。
コンストラタ処理後の=
演算子(operator=
)においては、マルチバイトからUnicodeに変換する定義が存在するため、Unicode文字に変換することができる。
// OK
CStringW strw;
strw = str;
// マルチバイトの場合は、コンパイルエラー
// Unicodeの場合は、OK
CStringW strw = str;
バイト数の取得
文字列のバイト数を取得する。
これは、文字列をファイルへ保存する場合等に必要となる。
dwSize = str.GetLength();
文字数の取得とは逆で、変数dwSizeはUnicodeの場合は"6"、マルチバイトの場合は"9"となるため、Unicodeの場合、正常にバイト数を取得することができない。
そこで、以下の例のように記述することにより、Unicodeおよびマルチバイトにおいて正常にバイト数を取得することができる。
TCHAR
型はプレースホルダであり、
sizeof(TCHAR)
は、Unicodeの場合はwchar_t
型(2バイト)、マルチバイトの場合はchar
型(1バイト)になる。
dwSize = str.GetLength() * sizeof(TCHAR);
※注意
文字セットがマルチバイトの場合、CStringW
クラスを使用すると正常にバイト数を取得することができない。
さらに、文字セットがマルチバイトの場合、かつ、CStringW
クラスのバイト数を取得する場合、sizeof(TCHAR)
を乗算せずに、2
を乗算することにより、正常なバイト数を取得することができる。