C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: テキストファイルのエンコードを知りたい


(過去ログ 103 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■61404 / inTopicNo.1)  テキストファイルのエンコードを知りたい
  
□投稿者/ sosio (1回)-(2011/08/11(Thu) 16:58:44)

分類:[VB.NET/VB2005 以降] 

あるテキストファイルのエンコードがUTF-8であるかを知りたいのですが、
お願い致します。
引用返信 編集キー/
■61406 / inTopicNo.2)  Re[1]: テキストファイルのエンコードを知りたい
□投稿者/ shu (937回)-(2011/08/11(Thu) 17:27:23)
No61404 (sosio さん) に返信
> あるテキストファイルのエンコードがUTF-8であるかを知りたいのですが、
> お願い致します。

先頭にUTF-8のBOMが書かれていればそれを信用してUTF-8とし書かれていなければ
&H80以上の最初のコードが現われるとこまで読み飛ばし、そこからUTF-8で読んでみて
UTF-8として正しいと判断できればUTF-8とする(この判断が結構あいまいなとこがあり大変)。

引用返信 編集キー/
■61407 / inTopicNo.3)  Re[1]: テキストファイルのエンコードを知りたい
□投稿者/ 魔界の仮面弁士 (2304回)-(2011/08/11(Thu) 17:39:25)
No61404 (sosio さん) に返信
> あるテキストファイルのエンコードがUTF-8であるかを知りたいのですが、
> お願い致します。

.NET であれば、手っ取り早いのは Encoding クラスを使う事でしょう。

GetEncoding の引数に DecoderExceptionFallback を指定しておけば、
「UTF-8 では定義されていないバイト列」をデコードする際、
バイナリ中のどの部分が変換エラーとなったのかを、例外として検知できます。
(例外にならないようであれば、それは正しい UTF-8 ということです)

-------

上記の他、バイナリデータを一つずつ見ていくという手法もあります。
それが「テキストファイル」であることが確定しているのであれば、
先頭 3 バイトが EF BB BF (16進数)であれば、多くの場合、そのファイルを
UTF-8 と見做すことができます。手抜きな検出方法ですが、データ全体を
走査する必要が無いため、DecoderExceptionFallback を使うよりも高速です。


一方、BOM 無しの場合は EF BB BF はありません。
この場合、UTF-8 ではそれぞれの文字が 2進数表現 で
 1 バイト文字……0xxxxxxx
 2 バイト文字……110xxxxx 10yyyyyy
 3 バイト文字……1110xxxx 10yyyyyy 10zzzzzz
 4 バイト文字……11110www 10xxxxxx 10yyyyyy 10zzzzzz
という並びになるように定義されていますので、これを基に判定することもできます。
なお、16進数で表現した場合はこんな感じ。

 コードポイント       第1バイト 第2バイト 第3バイト 第4バイト
-------------------   --------- --------- --------- ---------
 U+0000  〜U+007F   →  00 〜 7F 
 U+0080  〜U+07FF   →  C2 〜 DF  80 〜 BF
 U+0800  〜U+0FFF   →  E0        A0 〜 BF  80 〜 BF
 U+1000  〜U+CFFF   →  E1 〜 EC  80 〜 BF  80 〜 BF
 U+D000  〜U+D7FF   →  ED        80 〜 9F  80 〜 BF
 U+E000  〜U+FFFF   →  EE 〜 EF  80 〜 BF  80 〜 BF
 U+10000 〜U+3FFFF  →  F0        90 〜 BF  80 〜 BF  80 〜 BF
 U+40000 〜U+FFFFF  →  F1 〜 F3  80 〜 BF  80 〜 BF  80 〜 BF
 U+100000〜U+10FFFF →  F4        80 〜 8F  80 〜 BF  80 〜 BF

引用返信 編集キー/
■61416 / inTopicNo.4)  Re[1]: テキストファイルのエンコードを知りたい
□投稿者/ 甕星 (6回)-(2011/08/12(Fri) 05:11:53)
No61404 (sosio さん) に返信
> あるテキストファイルのエンコードがUTF-8であるかを知りたいのですが、
> お願い致します。

100%確実な方法と云うのはありません。

UTF-8として読んでみて、UTF-8ではありえない文字コードが含まれていたら、UTF-8ではないと判断するしかありません。もちろんこの方法ではたまたまUTF-8でもありえる文字コードしか使われていないだけで、実はUTF-8以外の文字コードで書かれている可能性があります。
引用返信 編集キー/
■61425 / inTopicNo.5)  Re[2]: テキストファイルのエンコードを知りたい
□投稿者/ todo (161回)-(2011/08/12(Fri) 12:34:38)
WebBrowserコントロールに読み込ませてcharsetを取得するとか。

NonDispBrowser wb = new NonDispBrowser();
wb.NavigateAndWait(@"c:\test.txt");
object doc = wb.Document.DomDocument;
object charset = doc.GetType().InvokeMember("charset", System.Reflection.BindingFlags.GetProperty, null, doc, null);
MessageBox.Show(charset.ToString());

NonDispBrowserクラスはこちらより拝借
http://www.atmarkit.co.jp/fdotnet/dotnettips/687nondispbrowser/nondispbrowser.html
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -