文字コード種別の判定


関数名
whatKanji  文字コードの種別を判定する
形式
int whatKanji(unsigned char *str);
引数
str  (入力)文字列
関数値
漢字の種別を表す値
・引数strの先頭文字が半角カナの場合、関数値は1
・引数strの先頭2文字がシフトJISコードの場合、関数値は2
・引数strの先頭2文字がEUC半角カナコードの場合、関数値は4
・引数strの先頭2文字がEUC全角コードの場合、関数値は8
・引数strの先頭3文字が新JIS(X0208-1983)シフトコードの場合、
 関数値は16
・引数strの先頭3文字が旧JIS(X0208-1978)シフトコードの場合、
 関数値は32
・引数strの先頭3文字がJISローマ字(X0201)シフトコードの場合、
 関数値は64
・引数strの先頭3文字がASCII シフトコードの場合、関数値は128
・上のケースが複数個同時に起きる場合は、関数値はそれらの論理和
・上のいずれでもない場合は、関数値は0
注意事項

用例(whatKanji-test.c
whatKanji("漢字");

プログラム(whatKanji.c
int whatKanji(unsigned char *str)
{
    int val = 0;
    unsigned char b1, b2, b3;

    b1 = *str++;
    b2 = *str++;
    b3 = *str;
    if (b1 == 0x1b) {
        if (b2 == '$' && b3 == 'B') return 16;
        if (b2 == '$' && b3 == '@') return 32;
        if (b2 == '(' && b3 == 'J') return 64;
        if (b2 == '(' && b3 == 'B') return 128;
        return 0;
    }
    if ( b1 >= 0xa0 && b1 <= 0xdf) val |= 1;
    if ((b1 >= 0x81 && b1 <= 0x9f ||
         b1 >= 0xe0 && b1 <= 0xfc) && 
        (b2 >= 0x40 && b2 <= 0xfc && b2 != 0x7f)) val |= 2;
    if (b1 == 0x8e && (b2 >= 0xa0 && b2 <= 0xdf)) val |= 4; 
    if ((b1 >= 0xa1 && b1 <= 0xfe) &&
        (b2 >= 0xa1 && b1 <= 0xfe)) val |= 8;

    return val;
}
説明
半角カナコードは 0xa0 - 0xdf の間を使う。

シフトJISコードは第1バイトとして 0x81 - 0x9f までと 0xe0 - 0xfc まで、第2バイトとして 0x40 - 0xfc まで(0x7fを除く)を使う。この ため、シフトJISは上記の半角コードと混在できる。しかし、制御文字 として使われる \(バックスラッシュまたは円記号)などが第2バイト の領域に入っているために問題が生じることがある。

EUCコードは第1、第2バイトとも 0xa1 - 0xfe までであるが、半角の カナ文字については、0x8e を半角カナ文字の前につけ、2バイトで表現 する。

一方、JISコードは7ビット系漢字コードであるため、つぎのようなシフト コードを使って、文字セットの切り替えを行い、かな漢字を表現する。

   シフトコード一覧
文字セット シフトコード
新JIS X0208-1983 ESC $ B
旧JIS X0208-1978 ESC $ @
JISローマ字 X0201 ESC ( J
ASCII ESC ( B

関連関数