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;
}

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