C言語 - EUC 半角文字数を数える

クラウディア 
1. 概要
2. EUC 半角文字数を数える

1. 概要

 表題にもう少し、解説をつけないとわかりにくい話です。  ちょっとした作業で必要になったので。  「EUC」の半角文字がはいった文字列があって、その文字数を数えるのです。
 半角文字としてはいっているのは「0~9」までの数字・「A~Z」、「a~z」の英字、および「ア~ン」コード的には「ヲ~ン」) までのカナ。
 記号はなし。
 文字列は「NULL」終端しているということが条件。
 「NULL」が出現した時点で文字列の終了とみなすし、「NULL」が出現するまでに、前出の条件以外の文字が出現したら「NG」扱いで文字数「0」とする。
 というのが命題です。  何がややこしいかというと「EUC」では半角カナは2バイト文字になっているということなのです。  つまり「strlen」では、半角カナがはいっている文字数分、多く数えてしまうのです。

2. EUC 半角文字数を数える

 「EUC」の文字コードに関しては「文字コード表 日本語EUC(euc-jp)」をご参照ください。  命題について書いたコードが
int strlenHalfEUC(const unsigned char string[])
{
	int i;
	int count = 0;

	for (i=0; ; i++)
	{
		if (string[i] == '\0')
		{
			break;
		}

		if ((('0' <= string[i]) && (string[i] <= '9')) ||
			(('A' <= string[i]) && (string[i] <= 'Z')) ||
			(('a' <= string[i]) && (string[i] <= 'z')))
		{
			count += 1;
		}
		else
		if  ((string[i] == 0x8E) &&										//	半角カナは 0x8EA6(ヲ)~0x8EDD(ン)
			((0xA6 <= string[i+1]) && (string[i+1] <= 0xDD)))
		{
			count += 1;
			i += 1;
		}
		else
		{
			return 0;													//	半角文字以外を検出
		}
	}

	return count;
}

 になります。  くっきり動作します。