MENU

c++でstring型文字列のそれぞれの文字が半角か全角かを判定する

英数字だけだったらこんな判定は必要ないのですが。英数字と日本語が混ざった文字列の長さを取得するときなどにも応用ができるので、覚えておいて損はないと思います。

ソースコード


#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
  string str = "全角半角判定するyo";

  while (!str.empty())
  {
    if (IsDBCSLeadByte(str[0]) == 0)
    {
       cout << str.substr(0, 1).c_str() << " :半角文字" << endl;
      str.erase(0, 1);
    }
    else
    {
      cout << str.substr(0, 2).c_str() << ":全角文字" << endl;
      str.erase(0, 2);
    }
  }

  return 0;
}

文字列の0番目が1バイト文字かそうでないかを判定し、判定し終わったらその文字を削除する。これを、文字列が空でない間繰り返すといった感じです。IsDBCSLeadByte()関数は、指定された文字が先行バイトかどうかを調べる関数です。先行バイトとは、マルチバイト文字の先頭の部分です。

実行結果

全:全角文字
角:全角文字
半:全角文字
角:全角文字
判:全角文字
定:全角文字
す:全角文字
る:全角文字
y :半角文字
o :半角文字

しっかり全角半角文字の区別ができています。