- 締切済み
UTF-8(日本語)の自動判別
VC++6.0で日本語(漢字)を処理するプログラムを作成しています。 以下のサイトを参考にして、下記 KanjiCode()関数にUTF-8の判別条件を入れたいのですが、判別のアルゴリズムとcodeの書き方がよくわかりません。 参考になるサイトか、アドバイスがあればよろしくお願いします。 出典: http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html -------------------------------------------------------------------- #define ASCII 0x00 #define EUC 0x01 #define SJIS 0x02 #define JIS 0x04 #define UTF8 0x05 #define JAPANESE 0xff //---- 半角カナの存在を無視した漢字コードの判定関数 int KanjiCode( char* text ) { for( u_char* ptr=(u_char*)text; *ptr; ptr++ ){ if( *ptr == 0x1b && *(ptr+1) == '$' ) return JIS; if( *ptr < 0x80 ) continue; if( 0x81 <= *ptr && *ptr <= 0x9F ) return SJIS; if( 0xA1 <= *ptr && *ptr <= 0xDF ) return EUC; if( *(ptr+1) <= 0xA0 ) return SJIS; if( /* ここにutf-8 の判別条件を入れたい */ ) return UTF8; } return ASCII; } -------------------------------------------------------------------- UTF-8の自動判別が出来れば文字コード変換は、WindowsであればMultiByteToWideChar/WideCharToMultiByteでなんとかなると考えています。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- php504
- ベストアンサー率42% (926/2160)
http://ja.wikipedia.org/wiki/UTF-8 を参考にして考えてみました if( (*ptr & 0xE0) == 0xC0 && (*(ptr + 1) & 0xC0) == 0x80 || (*ptr & 0xF0) == 0xE0 && (*(ptr + 1) & 0xC0) == 0x80 && (*(ptr + 2) & 0xC0) == 0x80 || (*ptr & 0xF8) == 0xF0 && (*(ptr + 1) & 0xC0) == 0x80 && (*(ptr + 2) & 0xC0) == 0x80 && (*(ptr + 3) & 0xC0) == 0x80 || (*ptr & 0xFC) == 0xF8 && (*(ptr + 1) & 0xC0) == 0x80 && (*(ptr + 2) & 0xC0) == 0x80 && (*(ptr + 3) & 0xC0) == 0x80 && (*(ptr + 4) & 0xC0) == 0x80 || (*ptr & 0xFE) == 0xFC && (*(ptr + 1) & 0xC0) == 0x80 && (*(ptr + 2) & 0xC0) == 0x80 && (*(ptr + 3) & 0xC0) == 0x80 && (*(ptr + 4) & 0xC0) == 0x80 && (*(ptr + 5) & 0xC0) == 0x80 ) return UTF8; 判定はEUCよりも先にしないとだめでしょう
お礼
ありがとうございました。お陰さまでできました。 難しいアルゴリズムを解読して頂いて感謝します。