HTML文書の文字コードの判定法

このQ&Aのポイント
  • C#のWebClientクラスを使って文字コード不明のHTML文書をダウンロードする方法について解説します。
  • 通常はシフトJISと仮定して読み込むが、文書中にEUC指定があった場合には再度EUCエンコード指定で読み込むこともあります。
  • 文字コードを判定して適切なエンコード方法を選択するためには、一度データをバッファに読み込み、正規表現を使用して文字コードの指定を検索します。
回答を見る
  • ベストアンサー

HTML文書の文字コードの判定法

HTML文書の文字コードの判定法 C#のWebClientクラスを使って文字コード不明のHTML文書をダウンロードしています 取り敢えずシフトJISと仮定して読込んでおりますが、文書中にEUC指定があった場合には改めてサイトよりEUCエンコード指定で再読込みしています 概略は次の通りです WebClient MyClient = new WebClient(); System.IO.Stream MyStream = MyClient.OpenRead("http://*****・・); System.IO.StreamReader MyReader = new System.IO.StreamReader(MyStream, System.Text.Encoding.GetEncoding("Shift_JIS")); ReadString = MyReader.ReadToEnd(); MyReader.Close(); MyStream.Close(); System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex( @"charset\s*=\s*euc-jp", System.Text.RegularExpressions.RegexOptions.IgnoreCase); if (r.IsMatch(ReadString)) { MyStream = MyClient.OpenRead("http://*****・・); ←以降2度読み MyReader = new System.IO.StreamReader(MyStream, System.Text.Encoding.GetEncoding("EUC-JP")); ReadString = MyReader.ReadToEnd(); MyReader.Close(); MyStream.Close(); } 2度読みというミットモナイ形になっているのは バッファに読込んだデータから文字コードを判定して各々適切にエンコードする方法が分らないからです 色々とトライしてみましたがNGでした この2度読みいう面目丸潰れ、無知蒙昧、天下の愚作を避ける簡単な手法を教えて頂けるよう恥を忍んでお願い申し上げます

質問者が選んだベストアンサー

  • ベストアンサー
  • nfonfonfo
  • ベストアンサー率63% (12/19)
回答No.1

1、WebClientを使用する前提ならば、MemoryStreamに内容を書き出してそこから文字判定する方法で可能かと。 ※)注意点として  MemoryStreamを読み終えた後、次のStreamReaderで読めるようにSeekで先頭位置に設定する必要があります。 2、Webサーバーから帰ってくるhttpヘッダ(Content-Type)でも文字コードの判別は可能です。   ContentType = MyClient.ResponseHeaders[System.Net.HttpResponseHeader.ContentType]; //以下ソース using System.IO; using System.Text.RegularExpressions; using System.Net; const string Address = @"http://oshiete.goo.ne.jp/"; string ContentType = string.Empty; string ReadString = string.Empty; using (MemoryStream mem = GetMemoryStream(Address, out ContentType)) { //Postionを先頭にする。 mem.Seek(0, SeekOrigin.Begin); StreamReader MyReader = new StreamReader(mem, System.Text.Encoding.GetEncoding("Shift_JIS")); ReadString = MyReader.ReadToEnd(); Regex r = new Regex(@"charset\s*=\s*euc-jp", RegexOptions.IgnoreCase); if (r.IsMatch(ReadString)) { //Postionを先頭にする。 mem.Seek(0, SeekOrigin.Begin); MyReader = new StreamReader(mem, System.Text.Encoding.GetEncoding("EUC-JP")); ReadString = MyReader.ReadToEnd(); } } public MemoryStream GetMemoryStream(string Address, out string ContentType) { MemoryStream mem = new MemoryStream(); using (WebClient MyClient = new WebClient()) { using (Stream MyStream = MyClient.OpenRead(Address)) { // HTTPヘッダのContentTypeを取得する。 ContentType = MyClient.ResponseHeaders[HttpResponseHeader.ContentType]; byte[] buffer = new byte[4096]; while (true) { int read = MyStream.Read(buffer, 0, buffer.Length); if (read <= 0) { break; } mem.Write(buffer, 0, read); } } } return mem; }

sato-may
質問者

お礼

お教え、ありがとうございました 早速Memory Streamを使用した方法に改良しました 結果は良好です 助かりました、ありがとう!!!

関連するQ&A

  • VB6.0にてStreamReaderを使用したいのですが、

    VB6.0にてStreamReaderを使用したいのですが、 Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", のコードが赤字でエラーになります。 どう修正すればよろしいでしょうか? ご存知の方教えてください。よろしくお願いします。 Dim strTemp As String Dim Reader As New IO.StreamReader("C:\Windows\System32\eula.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) strTemp = Reader.ReadToEnd msgobox strTemp Reader.Close

  • C#におけるファイル読み取りの文字化け

    開発初心者です。 //Shift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader(@txtShiteiFile.Text, System.Text.Encoding.GetEncoding(932)); //内容を全て読み込む string textAll = sr.ReadToEnd(); 以上の関数を使ってテキストファイル上の文字を読み取りしているのですが、 textAll 変数に入ったときに文字化けしています。 また、テキストファイルによっては文字化けしないときもあります。 この場合、どのような対処をすればよいのでしょうか?

  • HTTP接続すると文字化けがおこってしまいます

    VB2005です。 HTTPサーバーに接続してデータをテキストボックスに書き出す処理なのですが、どうしても文字化けしてしまい困っています。どうしたらよいでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ' HTTPサーバーへ接続する Dim client As New WebClient Try ' HTTPサーバーへ接続しストリームを取得する Dim stream As System.IO.Stream = _ client.OpenRead(TextBox1.Text) ' テキストボックスへ結果を書き出す Dim reader As New System.IO.StreamReader(stream) TextBox2.Text = reader.ReadToEnd() reader.Close() stream.Close() Catch ex As WebException ' URLが不正の場合は例外が発生する MessageBox.Show(ex.Message) End Try End Sub

  • ウェブ内容をshift-jis変換するには?

    続けての質問になってしまいます。 VB.NET で、ウェブクライアントで下記のようにウェブページの内容を取得しましたが、 コードがUTF?のため日本語で表示されません。 内容を変数に格納し、shift-jis変換するにはどのように記述すればよいのでしょうか? Dim webClient As New System.Net.WebClient Dim sr As System.IO.Stream = webClient.OpenRead("http://www.nikkei.co.jp/") Dim srRead As New System.IO.StreamReader(sr) TextBox1.Text = srRead.ReadToEnd  よろしくお願いします。

  • インスタンス化について

    .NETでのインスタンス化について .NETでプログラムの勉強をしています。インスタンスについてお教えください。 ↓では、「sr」はnewキーワードを使ってインスタンス化しています。 ********************************************************************************** //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容をすべて読み込む string s = sr.ReadToEnd(); //閉じる sr.Close(); //結果を出力する Console.WriteLine(s); ↓では、「enc」はnewキーワードを使ってインスタンス化していません。 ********************************************************************************** //読み込むテキストファイル string textFile = "C:\\text.txt"; //文字コード(ここでは、Shift JIS) System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //テキストファイルの中身をすべて読み込む string str = System.IO.File.ReadAllText(textFile, enc); //行ごとの配列として、テキストファイルの中身をすべて読み込む string[] lines = System.IO.File.ReadAllLines(textFile, enc); ********************************************************************************** 質問1: インスタンス化させる時にはnewキーワードが必要だと思っていましたが、「enc」はnewキーワードが使用されていません。 なぜでしょうか? 質問2: System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); 上記のように、newと同時にパスやエンコーディングを引数として渡しています。この事をコンストラクタとよぶのでしょうか? Googleで調べていますが、いまいち意味がわかりません・・・物凄くひらたくいうとどういったことなのでしょうか?何かプログラムではない、一般的な事で例えて頂けるとありがたいです。 宜しくお願い致します。

  • vb2008で文字列から文字列コードを取得する方法

    サイトHTMLをWebBrowserを使用せずに取得するために、 Dim stream As System.IO.Stream = client.OpenRead(tbItemURL.Text) Dim reader As New System.IO.StreamReader(stream) Dim strHtml = reader.ReadToEnd() reader.Close() stream.Close() のような形で文字列を取得しています。 しかし、この場合Sift-jis等の場合、後の作業(一部データ取得)で文字化けに悩まされます。 http://dobon.net/vb/dotnet/string/detectcode.html 上記サイトで「バイト配列」に格納して判別する方法があります。 そこで、文字列をバイト配列に格納しようとしますが…。 文字列→バイト配列には文字コードが必要となります。 Dim data() As Byte = Encoding.UTF8.GetBytes(text) なんだか鶏と卵のような感じになってしまいます。 文字列から文字コードを判別する方法はないでしょうか? よろしくお願いします。

  • C# ファイルを読み込みlistviewに展開

    C#でtxtファイルを読み込み、listviewに展開したいのですが、txtファイルが ○○○,○○○ △△△,△△△ となっている場合、最初の一文字が消えて ○○,○○○ △△△,△△△ と表示されます。 コードは下記の通りです。 System.IO.StreamReader load = new System.IO.StreamReader(@".\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); load.Read(); String file; while ((file = load.ReadLine()) != null) { string[] txtdate = file.Split(','); itemx = new ListViewItem(); itemx.Text = txtdate[0]; itemx.SubItems.Add(txtdate[1]); listView1.Items.Add(itemx); } load.Close(); 何を直せば最初の一文字目も読み込まれるかご教授下さい。

  • C#のテキストファイル読み込みについて

    C#のテキストファイル読み込みについて 2次元配列を使います(a[行][列]みたいに テキストファイルを1文字ずつ読み込みます。 そして、改行文字が見つかると行を1つずらします それを繰り返して最後まで読みこむと終わり そんなことをしたいです DOBON.NETでこんなの見つけたんですが 上の処理をしようと思っても、どこをいじればできるのかわかりませんでした //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容を一行ずつ読み込む while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } //閉じる sr.Close(); よくわかるサイトとかあったら教えてください、お願いします

  • C#での文字置換について

    hoge.txt -------------- #abc_1 111111111 222222222 333333333 #abc_2 111111111 222222222 333333333 #abc_3 ... -------------- StreamReader sr = new StreamReader("hoge.txt", Encoding.GetEncoding("UTF-8")); sr.ReadToEnd(); でファイルを読み込み#abc_1から#abc_2の間の 111... 222... 333... というのを削除して 出力したいのですが分かりません。 (同様に#abc_2から#abc_3の間も削除します) つまり出力は #abc_1 #abc_2 #abc_3 となるように。 宜しくお願いします

  • C# 文字コード変換

    お世話になります。 宜しくお願いします。 C#でプログラムを開発しております。 その中で、文字列をShift-JISでテキストファイルへ書き出す という処理があるんですが 以下のように指定しても文字コードがUTF-8で書き出されているようです。 コードを調べましたが間違いが見つけられません。 どこか間違いはございますでしょうか。 ご教授宜しくお願いします。 ・文字コードを判別する場所 : http://encode-detector.uic.jp/tool ・テキストの形式 :ファイル名.DMD /////////////// 以下コード /////////////////////////     String param = "テキストへ書き込む内容";     System.IO.StreamWriter sw =          new System.IO.StreamWriter(             @"C:\hoge.DMD",              false,             System.Text.Encoding.GetEncoding("Shift_JIS") );     System.Text.Encoding src = System.Text.Encoding.UTF8;     System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS");     byte[] temp = src.GetBytes(param);     byte[] sjis_temp = System.Text.Encoding.Convert(src, dest, temp);     param = dest.GetString(sjis_temp);     sw.Write(param);     sw.Close();

専門家に質問してみよう