#define jms1(c) \ (((0x81 <= ((unsigned char)(c))) && (((unsigned char)(c)) <= 0x9F)) || ((0xE0 <= ((unsigned char)(c))) && (((unsigned char)(c)) <= 0xFC) )) #define jms2(c) \ ((0x7F != (unsigned char)(c)) && (0x40 <= ((unsigned char)(c))) && (((unsigned char)(c)) <= 0xFC)) //********************************************************* // 文字列 str の str[nPos] について、 // 0 …… 1バイト文字 // 1 …… 2バイト文字の一部(第1バイト) // 2 …… 2バイト文字の一部(第2バイト) // のいずれかを返す。 //********************************************************* int isJMS( const char *str, int nPos ) { int i; int state; // { 0, 1, 2 } // 0 = 1バイト文字 // 1 = 2バイト文字の第1バイト // 2 = 2バイト文字の第2バイト state = 0; for( i = 0; str[i] != '\0'; i++ ) { if ( ( state == 0 ) && ( jms1( str[i] ) ) ) state = 1; // 0 -> 1 else if ( ( state == 1 ) && ( jms2( str[i] ) ) ) state = 2; // 1 -> 2 else if ( ( state == 2 ) && ( jms1( str[i] ) ) ) state = 1; // 2 -> 1 else state = 0; // 2 -> 0, その他 // str[nPos] での状態を返す。 if ( i == nPos ) return state; } return 0; }//isJMS
ネタ元