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