- 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;
}
になります。
くっきり動作します。
|
|