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
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; }
シフト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 |