MFC   VC++   Visual Studio   Visual Studio   プログラミング

文字列の文字数とバイト数

 文字セットをUnicodeとマルチバイトにした時の、文字列の文字数とバイト数について書きます。

 まず、これから書いていくことは、
    CString str = _T("123あいう");    // 基本の文字列
    int iLength;                    // 文字数
    DWORD dwSize;                    // 文字サイズ
 という、文字列を前提に話をしていきます。

 この文字列は、見た目で文字数iLengthは"6"ということがわかりますが、これをコードで、
    iLength = str.GetLength();
と書くと、iLengthはUnicodeの場合"6"となり、マルチバイト文字の場合"9"となり、マルチバイトの場合、目的の文字数が得られない。

 そこで、「wctomb_s」などを使っても良いのだが、折角MFCを使っているのだからCStringWを使います。
    CStringW strw;
    strw = str;
    iLength = strw.GetLength();
としておくと、マルチバイト、UnicodeともiLengthは"6"になります。

 ここで、
    CStringW strw;
    strw = str;
のところを、
    CStringW strw = str;
とすると、Unicodeのときは問題ありませんが、マルチバイトのときにコンパイルエラーになります。

 これは、CStringWのコンストラクタには、マルチバイト文字→Unicode文字が定義されていないためで、最初の"="で代入する方法だと「operator=」で定義されているため、内部で勝手にUnicode文字に変換されるのです。

 以上のように、文字数の取得は出来ました。
 次に、ファイルへ保存する時などに必要になる文字列のバイト数ですが、
    dwSize = str.GetLength();
とすると、今度は文字数とは逆で、dwSizeはUnicodeの場合"6"となり、マルチバイト文字の場合"9"となり、Unicodeの場合、目的のバイト数が得られない。

 そこで、今度は比較的単純で、
    dwSize = str.GetLength() * sizeof(TCHAR);
とすると、両方できちんと目的のバイト数が得られる。

 何故、この方法できちんとバイト数が得られるかというと、sizeof(TCHAR)は、Unicodeのとき「TCHAR」が「wchar_t」となり2バイト、マルチバイトのとき「TCHAR」が「char」となり1バイトになるからです。
 文字セットがマルチバイト文字のとき、文字数を取得するCStringWを使って上記の方法をしてしまうと、strのバイト数は違う値になるので注意が必要です。
 さらに、文字セットがマルチバイト文字のとき、CStringWのバイト数を求めたい場合は、sizeof(TCHAR)を掛けると違う値になるので、この場合は"2"を掛けるようにします。
ランキングへ     posted by 遠雷 | Comment(0) | MFC
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。