• 締切済み

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でなんとかなると考えています。 よろしくお願いします。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

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よりも先にしないとだめでしょう

kahata
質問者

お礼

ありがとうございました。お陰さまでできました。 難しいアルゴリズムを解読して頂いて感謝します。

関連するQ&A

  • 文字コードの違うデータを判別したい

    データの文字コードが異なるファイルを確認します。 以下のスクリプトで$get_csvのデータの文字コードを判別にShift-JISで別のファイルに格納したいのです。 (スクリプト) $get_csv = get("$_[0]"); if ($get_csv =~ /utf-8/i) { &jcode'convert($get_csv,'sjis','utf-8'); } if ($get_csv =~ /EUC-JP/i) { &jcode'convert($get_csv,'sjis','euc'); } (ここまで) &jcode'convertの使い方が悪いのか?データをうまく変えられていない感じがします。 上記の内容で説明が足りてますでしょうか? よろしくお願いいたします。

  • 日本語だけを抽出したい

    SJIS、EUC、UTF8、のどれがくるかわかりませんが、 かつ、その中で、どの言語がくるかわかりませんが、 その中で、日本語だけを、可能な限り容易に判別する方法は ありますでしょうか? また、既存のモジュールを可能な限り使用しない方法でもあります。 #pureperlで書かれていれば、移植はできますが ひらがな、カタカナを抽出すればいいのもありますが、 仮対処にしかならず、漢字だけの場合の抽出が できなくなってしまいます。 以下、参考までに・・ 内部コードがSJIS? #内部コードも、SJIS、EUC、UTF8のどれになるかわかりません。 UTF8の日本語がきたら、SJISになる UTF8の中国語がきたら、化ける(捨てる対象 EUCの日本語が来たら、SJISになる EUCの韓国語がきたら、化ける(捨てる対象) SJISの日本語が来たら、そのまま ・・のような感じになってしまいますので。。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字コード(UTF-8)文字化けについて

    以下のphpを実行したところ、入力した文字によって文字化けしたりしなかったりします。 どなたか原因が分かる方がいらっしゃったら教えてください。 (見、一は化けない。上、実は化ける。) phpはバージョン5.2.8を使用しています。 (コード)----------------------- <html lang="ja"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> <head> </head> </body> <?php mb_language("Japanese"); mb_internal_encoding("UTF-8"); $org_text1 = "見"; $org_text2 = "上"; $org_text3 = "実"; $org_text4 = "一"; $telop_text1 = mb_convert_encoding($org_text1,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text2 = mb_convert_encoding($org_text2,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text3 = mb_convert_encoding($org_text3,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text4 = mb_convert_encoding($org_text4,'utf-8','ASCII, JIS, EUC-JP,SJIS'); echo "telop_text1="; echo $telop_text1; echo "<br>"; echo "telop_text2="; echo $telop_text2; echo "<br>"; echo "telop_text3="; echo $telop_text3; echo "<br>"; echo "telop_text4="; echo $telop_text4; ?> </body> </html> (結果)------------------------- telop_text1=見 telop_text2= telop_text3=タ telop_text4=一

    • ベストアンサー
    • PHP
  • 文字コードの判別について

    とあるテキストファイルがあります。UNIX上で文字コードの判別を行いたいのですが、nkf --guess test.txtと打って調べると、 test.txt: ASCII (CRLF) となります。このファイルは、Shift-JISだという判定だと思います。 ファイルをUTF8に変換したいので、(1)Windows上のエディタ(秀丸)の機能を使ってUTF8に変換してからUNIX上にアップロードしたり、また(2)UNIX上から直接nkf -w --overwrite test.txtを実行して変換したりしたのですが、nkf --guess test.txtを打って調べると相変わらず test.txt: ASCII (CRLF) のままです。 色々調べた結果、ファイルの中身が英数字のみしか書かれていないので、nkfがこのファイルをShift JISだと「推測」しているということがわかってきました。確かに、試しにファイルの中身に日本語を書いて保存して実行してみると、ようやくnkf --guess test.txtの結果が test.txt: UTF-8 (CRLF) と表示されるようになりました。 これらの結果は、ファイルの中身のマルチバイト文字のコードを見て初めて文字コードがわかるようになるというように思えます。 私の理解ではファイル自体にEUCやShift JIS、UTF-8などの文字コードがあるものとばかり思っておりました。つまり、test.txtの内容が"This is a pen."であったとしてEUC、Shift JIS、UTF-8では全く異なる三種類のファイルが存在し得るものだと思っておりました。しかしこれは私の理解が間違っていて、英数字であれば常にShift JISであり、マルチバイト文字があって初めてUTF-8なのかEUCなのかShift JISなのかが決定されるということなのでしょうか? 英数字のみのファイルでもUTF-8ファイルという前提を確認する方法はないのでしょうか? 宜しくお願いします。

  • Ruby 文字コード判別

    NKF.guessで文字コードを判別し、そのコードがWindows-31J以外だったら エラーが出るようにしたいです Shift-JISの場合だと if(NKF.guess(str) == NKF::SJIS) この様に記述をして判別させています SJISの部分をCP932に変えて試してみましたが駄目でした 宜しくお願いします

    • ベストアンサー
    • Ruby
  • 文字コードってUTF-8が主流に?

    文字コードについては、UTF-8が主流になりつつあるってネットで観ました。 文字コードを検索すると次のような説明があります。 (UTF-8のエンコード) UTF-8は、UnicodeとASCIIコードを混在させるための規格です。 (シフトJISコード) シフトJISコードは、SJISとも呼び、Microsoft社が決めたコードでWindows95やMS-DOSやMacなどで使用されています。 その上で質問です。 1、 UTF-8が主流になるってことは、Windows、MacがUTF-8に方向転換するってことでしょうか? 2、 仮にUTF-8が主流になっても、サイトに <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> と記述していれば文字化けなく表示されるのでしょうか? 今の時点では判断できない質問なのでしょうか・・

  • コード変換について

    このようなS-JISからEUCにコードを変換する関数のサンプルで見つけたのですが。これを実装するにはどうすればいいのかわかりません。 unsigned int sjis2euc(unsigned int sjis) {   unsigned int hib, lob;   hib = (sjis >> 8) & 0xff;   lob = sjis & 0xff;   hib -= (hib <= 0x9f) ? 0x71 : 0xb1;   hib = (hib << 1) + 1;   if (lob >= 0x9e) {     lob -= 0x7e;     hib++;     } else if (lob > 0x7f) lob -= 0x20;   else lob -= 0x1f;   hib |= 0x80;   lob |= 0x80;   return (hib << 8) | lob; } たとえば char *str[] = "あいうえお" などとなっているにはどうやってこの関数を活用すればいいのでしょうか。

  • 文字コード変換

    PHP4.4を使っています。 プログラム中の文字列変数値「標の鷹」から、 http://xxx.cgi?prm=%95W%82%CC%91%E9 という文字列(リンク)を生成したいのですが、 http://xxx.cgi?prm=�W�̑� のようになってしまいます。 ソースは以下の通りです。 $img_url = "http://xxx.cgi?prm=".$row[0]; mb_detect_order("ASCII, JIS, UTF-8, eucJP-win, EUC-JP, SJIS-win, SJIS"); $enc = mb_detect_encoding($row[0]); // この時点で$row[0]=「標の鷹」 if ( ($enc != "ASCII") && ($enc != "JIS") && ($enc != "UTF-8") && ($enc != "eucJP-win") && ($enc != "EUC-JP") && ($enc != "SJIS-win") && ($enc != "SJIS") ) {   echo "未知の文字コードが入力されました。<br />\n";   exit; } $url = mb_convert_encoding($url,"SJIS",$enc); echo "url = ".$img_url."; ※ちなみに、このコードが書いてあるphpファイルはutf8です。

    • ベストアンサー
    • PHP
  • 文字コードsjisをUTF8に書き換えたい

    CGIの勉強中の者です。 文字コードはSJISで保存しているCGIをUTF8コードに換えるには何が必要でしょうか? HTMLならmeta内をSJISからUTF8に変更し、TeraPadなどのテキストエディタでUTF8に保存すればオッケーなんですが。 CGIの場合はHTMLと違って、換えるには複雑なのでしょうか? CGIプログラムの中では以下の「sjis」を「UTF8」に書き換えし、UTF8で保存しましたけど、文字化けが出てます。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; 宜しくお願いします。

    • 締切済み
    • CGI
  • JavaScriptが文字化けする

    JavaScriptファイルをSJIS、EUC、UTF8を統一したために スクリプト上で var str = "あいうえー"; をUTF16で var str = "\u3042\u3044\u3046\u3048\u30fc"; このように変換をしましたが alert("\u3402");とかですと、文字化けはしないのですが、 innerhtml="\u3402"; のようにやると、文字化けをしてしまいます。 どのようにしたら対処できますでしょうか? もし、対処方法なければ、仕方ないので、コード判別をできるようにと考えています。

専門家に質問してみよう