C#のaxWebBrowserでエンコードを変更する方法

このQ&Aのポイント
  • axWebBrowserを使用してエンコードの変更を実装する方法について質問します。
  • C#で開発しているインターネットブラウザにおいて、コンボボックスから選択したエンコードで表示されている文字列を再読み込みする方法を教えてください。
  • 現在の処理ではhtmlを正しく読み込むことができますが、画像ファイルなどのリンクが切れてしまいます。また、2回以上エンコードを変更しようとするとエラーが発生してしまいます。
回答を見る
  • ベストアンサー

C#のaxWebBrowsrでエンコードを変更する方法

こんにちわ。 私は今、axWebBrowserを使用して インターネットブラウザを作っています。 インターネットエクスプローラーをモデルにして エンコードの変更を実装したいのですが、 期待通りに動かすにはどうれば良いか解らないので質問させて頂きます。 開発環境 OS : windowsXP 環境 : Microsoft Visual Studio 2008 言語 : C# やりたい事 コンボボックスに格納したEncodingクラスの中からエンコードを選択するとaxWebBrowserに表示されている文字列を 指定されたエンコードで再読み込みする。 動作のモデルは、インターネットエクスプローラーで 表示→エンコード→エンコードのリストの中からクリック をした時の動作です。 現在、どの様なコーディングをしていて何故できないのか? 現状の処理の流れを説明します。 エンコードを格納したコンボボックスに SelectedIndexChanged関数を作成し、 System.Net.WebClientで新しくhtmlを読み込んで Documentに読み込ませています。 以下にソースコードを書きます private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { // 選択したインデックスが0に満たない場合はリターン if (0 > comboBox2.SelectedIndex) {  return; }  // htmlを指定したエンコードで取得  System.Net.WebClient wc = new System.Net.WebClient(); // axWebBrowser1が現在表示しているurlを読み込む  System.IO.Stream st = wc.OpenRead(((mshtml.HTMLDocumentClass)axWebBrowser1.Document).url); // エンコードの決定  Encoding enc = (Encoding)comboBox2.SelectedItem;  // 指定したエンコードで読み込む  System.IO.StreamReader sr = new System.IO.StreamReader(st, enc);  // HTML取得  string html = sr.ReadToEnd();  // ストリームを閉じる  sr.Close();  st.Close(); // 取得したhtmlをaxWebBrowserに読み込ませる  ((mshtml.HTMLDocumentClass)axWebBrowser1.Document).IHTMLDocument2_write(html); } このコーディングだと htmlは読み込むのですが、 画像ファイル等のリンクが切れていて、 例えばgoogleのTOPページでインターネットエクスプローラーから ソースを表示してソースをローカルPCにhtmlファイルとして保存して そのhtmlファイルを読み込ませた時と同じ結果になっていまいます。 (webページとしてサーバーからの情報を読み込んでいないと言う表現で伝わるでしょうか?) そしてエンコードをコンボボックスから2回以上変更しようとすると 2回目にaxWebBrowserのurlがabout:blankとなりwc.OpenRead関数で 例外処理が発生します。 どうすればインターネットエクスプローラーでエンコードを変更した時の様に webページとして読み込んで エンコードが違う場合は文字化けし 適切なエンコードを選択すると文字化けが解消される といった動作を行わせることが出来るでしょうか?

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

  • ベストアンサー
回答No.1

うまく回答に纏められないのでメモ殴り書き: axWebbrowserでなきゃだめなのか? System.Windows.Forms.WebBrowser はどうか?(MS謹製の.NET Frameworkは内部でaxWebbrowser利用しているらしいけど) #Windows依存であるSystem.Windows.Forms名前空間にどっぷり浸かっても良いものか?俺はたとえいくつかの実装がMicrosoft.VisualBasic名前空間をサポートしたとしてもできるだけ使わないように努力している。Mono.WebKitとかにした方が無難? #そういう信念上の話を抜きにするなら動作上は一応たしかMonoも別なコンポーネントを利用して実装しようとしていたはず。 http://www.mono-project.com/WebBrowser #何か俺の環境だとMonoのライブラリ使ってコンパイルできないんですが。 #大元の質問の答えは調べてないけれど、ここを突破できるなら ===================== http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.document.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.htmldocument.encoding.aspx あたりでどうにかなるはず。 以下、サンプルソース ====================== using System; namespace Q5498456A { class Q5498456A:System.Windows.Forms.Form { private System.Windows.Forms.WebBrowser webbrowser1; private System.Windows.Forms.ComboBox combobox1; Q5498456A(){ this.Width = 800; this.Height = 600; webbrowser1 = new System.Windows.Forms.WebBrowser(); webbrowser1.Top = 0; webbrowser1.Left = 0; webbrowser1.Width = this.Width; webbrowser1.Height = this.Height - 200; combobox1 = new System.Windows.Forms.ComboBox(); combobox1.Items.Add(System.Text.Encoding.GetEncoding(932).WebName); combobox1.Items.Add(System.Text.Encoding.UTF8.WebName); combobox1.Top = this.Height - 200; combobox1.Left = 0; combobox1.Width = this.Width; combobox1.SelectedIndex = 0; combobox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; combobox1.SelectedIndexChanged += combobox1_SelectedIndexChanged; this.Controls.Add(combobox1); this.Controls.Add(webbrowser1); webbrowser1.Navigate("http://localhost/OKWave/Q5498456/aaa.html"); } private void combobox1_SelectedIndexChanged(Object sender,System.EventArgs e){ /* むかつくことにこのプロパティ、System.Text.EncodingじゃなくてStringなんです */ webbrowser1.Document.Encoding = (string)(((System.Windows.Forms.ComboBox)sender).SelectedItem); webbrowser1.Refresh(); } /* つけないとコンパイラが怒る。理由はわからん */ [STAThreadAttribute] public static void Main(){ Q5498456A f1 = new Q5498456A(); f1.ShowDialog(); } } }

okayiamsss
質問者

お礼

ご回答ありがとうございます。 ご教授いただいた方法と違うのですが、実現できましたので、 解決した方法をこの場を借りて書き込みたいと思います。 取得したhtmlを ((mshtml.HTMLDocumentClass)axWebBrowser1.Document).IHTMLDocument2_write(html); ではなく ((mshtml.HTMLDocument)axWebBrowser1.Document).body.innerHTML プロパティに代入した所期待通りの動作をさせる事ができました。 ありがとうございました。

関連するQ&A

  • ウェブ内容を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  よろしくお願いします。

  • 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度読みいう面目丸潰れ、無知蒙昧、天下の愚作を避ける簡単な手法を教えて頂けるよう恥を忍んでお願い申し上げます

  • すでにファイルが開かれている時のエラー回避

    VB2010で、ファイルを開いていると下記のコードでエラーがでます。 Dim SR As New System.IO.StreamReader(AppPath & "諸元一覧.csv", System.Text.Encoding.Default) 「諸元一覧.csv」ファイルを閉じてください。 とメッセージを出し、ExitSubしたいのですが、 どういうコードにすればよいのでしょうか。 教えてください。よろしくお願いいたします。

  • c#でcsvから指定の1行だけを読み込む方法

    以前c言語で同じような質問をして、とても有益な回答を頂きましたが、 今回c#でのコードの書き方をご教示いただければと思い、再度質問致します。 例えば以下のようなcsvファイルがあったとします。 ab1,ef2,ab3,af4,ab5 bb1,bf2,bb3,bf4 cb1,cf2,cb3,cf4,cb5 zb1,zf2,zb3,zf4,zb5 プログラムに"cb3"という文字列を探させて、その文字列を含む一行 "cb1,cf2,cb3,cf4,cb5"のみを読み込む方法を探しております。 現時点では以下のコードにてcsvファイルを丸々読み込んでおります。 private void LoadData()//csvファイルを読み込む { string path = "abc.csv"; string delimStr = ",";//区切り文字 char[] delimiter = delimStr.ToCharArray();//区切り文字をまとめる string[] strData;//分解後の変数 string strLine; //1行分のデータ Boolean fileExists = System.IO.File.Exists(path); if (fileExists) { System.IO.StreamReader sr = new System.IO.StreamReader( path, System.Text.Encoding.Default ); while (sr.Peek() >= 0) { strLine = sr.ReadLine(); strData = CsvToArrayList1(strLine)[0]; abc.abctable.AddabctableRow ( strData[0], int.Parse(strData[1]) ); } sr.Close(); } c言語の時はstrstrで特定の文字を含む1行のみを取得できたのですが、 c#ではもっと良い方法があるのではと考えております、 お時間がありましたら是非教えてください。 皆様の丁寧な回答にいつも感謝しております。

  • コンボボックスの削除の仕方

    コンボボックスのリストの削除はどうしたらよいでしょうか。 private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { index = comboBox1->SelectedIndex; cout << "index=" << index << "\n"; } private: System::Void button2_Click_1(System::Object^ sender, System::EventArgs^ e) { //comboBoxからデータ削除 comboBox1->Items->RemoveAt(index); このようなコードを書いてみましたがうまくいいきません。

  • ”System::IO::StreamReader”ってどういう意味ですか?

    Visual C++ 2008 Express Editionで、現在、600kバイト程度のバイナリファイルを読み込んで特定の番地のデータだけを取り出してそれをテキスト変換してテキストボックス内に表示させるというプログラムを作成しているのですが、このことをOKwaveでどのようにコーディングするかを教えてもらったところ、 System::IO::StreamReader^ sr=gcnew StreamReader(_T("sample.txt")); このような文を教えてもらったのですが、全く知識がなく何をやっているのかわかりません。 ”sr”というのは変数で、sample.txtからstreamReader関数でsample.txt内のデータをsr変数に 入れているという感じがしますが、”System::IO::StreamReader”とか”gcnew”とかの意味がよくわかりません。 どうかご教授お願いいたします。

  • コンボボックスからテキストボックスへのデータ反映

    コンボボックスにてデータ(文字列+数字)を選択して、同フォーム内にある テキストボックスへ数字だけを表示させるにはどのようにコードを入力すれば良いでしょうか? VS2010を利用しています。 コンボボックスには、●●会社 00000000000 ▲▲会社 1111111111 といったように登録されております。 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged TextBox1.Text = ComboBox1.Text End Sub 上記のコードですと、文字列+数字がテキストボックスへ反映されてしまいます。 お忙しい中お手数をお掛けしますが、ご教授下さい。

  • VB2008

    VB初心者です、よろしくお願いいたします。 現在、VB2008を使い、顧客名簿を作成しています。 前回の質問で、テキストファイルのファイル名だけを取得する方法は分かったのですが、そのファイルの内容をテキストボックスに表示する方法がうまくいきません。 ファイルの内容は 1行目→名前 2行目→メールアドレス 3行目→郵便番号 4行目→住所 5行目→購入した商品 をそれぞれ、textbox1~5に表示させたいと思っています。 書籍などで調べた結果 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim totalcount As Integer Dim oneline As String Dim sr As System.IO.StreamReader sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") oneline = sr.ReadLine() sr.Close() Dim skipline As Integer Dim r As Random = New Random() skipline = r.Next(totalcount) sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") Dim i As Integer = 0 Do While i < skipline sr.ReadLine() i += 1 Loop oneline = sr.ReadLine() sr.Close() TextBox1.Text = oneline TextBox2.Text = (skipline + 1).ToString() End Sub このような記述になりました。 textbox1には問題なく名前が表示されますが、textbox2には"1"と表示されてしまいます。 すみませんが、修正箇所を教えていただけませんか? よろしくお願いいたします。

  • C#でIEの操作ができないページの操作方法

    C#でIEを操作しようとしているのですが、HTMLを取得する際にエラーが出てしまします。なぜでしょうか? yahooなどのサイトのHTMLは取得できるのですが、実際にhtmlを取得したいサイトは「型 'System.Net.WebException' のハンドルされていない例外が System.dll で発生しました 追加情報:接続が切断されました: 送信時に、予期しないエラーが発生しました。」とエラーがでます。 HTMLが取得できないサイトがあるのでしょうか? その時にどうすればHTMLを取得し、操作できるのかその方法を教えてください。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Encoding enc = Encoding.GetEncoding("Shift_JIS"); string url = "https://www.yahoo.co.jp/"; WebRequest req = WebRequest.Create(url); WebResponse res = req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); Console.WriteLine(html); } } }

  • c#でボタンのアクションが終わった後に再度同じ動作をさせるには?

    アプリ上のボタンを押すと以下のLoadData()が実行され、 データセットにcsvファイルの情報が代入されるのですが、 一度実行されるとソフトを再起動しないと、ボタンを押しても再度同じ動作をしてくれません。 今回の場合、フォームに入力された数値が変数expに代入され、 代入された数値をcsv内で検索し、ヒットすればその行だけ読み込むというプログラムですので、一度実行されても再度別の数値で同じ動作を繰り返し行いたいのです。 初歩的な事かと思いますが、どうすれば再起動しなくても同じ動作を繰り返すようになるのか教えてください、よろしくお願いします。 public void LoadData() { string path = @"C:\Documents and Settings\PC USER\デスクトップ\222.csv"; string strLine;//1行分のデータ int p; string exp;//この文字を含む行のみを読み込む exp = textBox1.Text; Boolean fileExists = System.IO.File.Exists(path); if (fileExists) { System.IO.StreamReader sr = new System.IO.StreamReader(path, System.Text.Encoding.Default); while (sr.Peek() >= 0) { strLine = sr.ReadLine(); p = strLine.IndexOf(exp);//指定文字が変数内にあるかどうかチェック if (p > 0) { strData = CsvToArrayList1(strLine)[0]; Dbuse.Dbusetable.AddDbusetableRow ( strData[0], int.Parse(strData[1]), strData[2], strData[3], strData[4] ); } else { } } sr.Close(); }

専門家に質問してみよう