C++で char がマルチバイト文字か判定する

このページでは char 型の文字が1文字なのかマルチバイトなのかチェックする方法を紹介します。

スポンサード リンク

例えばマルチバイト文字が含まれる文字列に対して、

 *p == '}'

のような判定を行うと、意図しない文字がヒットする場合があります。
これは2バイトで構成される漢字などのマルチバイトの1バイト目あるいは2バイト目が意図せずヒットした場合などで発生します。

このような場合は、文字がマルチバイトの長さをチェックする関数である _mbclen を使用します。引数として渡した文字の長さを返しますので、2バイト文字の1バイト目の場合は戻り値として2を返します。それ以外は1を返します。

mbclen はマルチバイト文字 c の長さが 1 バイトまたは 2 バイトであるかによって、1 または 2 を返します。 _mbclen には、エラーの戻り値はありません。 mbstrNULL でない場合、mblen は、マルチバイト文字の長さをバイト単位で返します。 mbstrNULL であるか、またはワイド文字の null 文字を指し示す場合には、mblen は 0 を返します。 mbstr が指し示すオブジェクトが、最初の count の文字内で有効なマルチバイト文字を構成していない場合には、mblen は –1 を返します。

以下は文字列 AあBいC に対して0番目~7番目がマルチバイト文字の1文字目かどうかをチェックします。
この場合は「あ」「い」の1バイト目で_mbclen が2を返し、それ以外では1を返します。

#include "stdafx.h"
#include <windows.h>
#include <mbstring.h>

int main()
{
 char Str[] = "AあBいC";
 char *p = Str;
 int num = 0;

 while (*p != 0)
 {
   if (_mbclen((BYTE*)p) == 1)
   {
     printf("%d文字目は1バイト文字\n", num++);
   }
     else
   {
     printf("%d文字目は2バイト文字\n", num++);
   }
   p++;
 }
 return 0;
}

結果は以下の通りです。

0文字目は1バイト文字
1文字目は2バイト文字
2文字目は1バイト文字
3文字目は1バイト文字
4文字目は2バイト文字
5文字目は1バイト文字
6文字目は1バイト文字

スポンサード リンク

[VC++ サンプルに戻る]