C# Programming

ImageWebAccess (Webから HTML ドキュメントを取得する)

開発環境: Visual Studio 2003 

1.目次

2.目的

  • 次のような機能のForm アプリケーションを作る。
    • 指定された URL から HTML を取得し、TextBoxに表示する。
    • Encoding は ListBox で指定する。
    • 対応するエンコーディングは、Shift JIS, Unicode, UTF-8, UTF-7
    • 読み込み中は WaitCursorにする。
Image

3.参考書

(1) キャラクタセットの認識

4.作り方

 
簡単なので、ソースコードのコメントを参照。

注意
TextBoxの改行は "\r\n"とする必要がある。 "\n"だけでは改行しない。
世の中の人には当たり前なのかもしれないが、統一が取れてないなぁ!
デフォルトのエンコーディング:System.Text.Encoding.Default は Shift JIS。
System.Text.Encoding のHelp を見る限りでは、StreamReaderで扱えるエンコーディングにEUC なんて記載されてない。
書かれているのは、Shift JIS, Unicode, UTF-8, UFT-7などで、JIS, EUC は標準でサポートされてない。
そんな馬鹿な!と思っていたら、GetEncoding("euc-jp")で、EUCのエンコーディングもできるんですね。
Internet Explorer ではちゃんと動くし、動作上は問題ないはずだけど、ヘルプに書いてないってことは、
正式サポートしてないってことですよね!
ちゃんとサポートして欲しいし、ヘルプを作ってほしいなぁ!
ヘルプに記載されているコードページ以外を使用する場合は、例外があがらなければ基本的に動作すると考えていいと思います。
ただし、趣味で作っている分にはいいけど、『動くということ』と、『サポートされている』ということは『違う』ということを認識した上で使ってね。

ということで、よく使うエンコーディングの対応表です。

EncodingIDWindowsコードページ番号
シフトJISshift_jis932
JISiso-2022-jp50220
UTF-8UTF-865001
Western iso-8859-1
1252
EUCeuc-jp51932

5.ソースコード


日付修正履歴
2002/4/16初期バージョン作成
2002/5/25EUC が扱えるように修正
2003/10/15VS.2003 で動作するように修正。
Form1.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;

namespace WebRequest
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.TextBox textURL;
                private System.Windows.Forms.Button button1;
                private System.Windows.Forms.TextBox response;
                private System.Windows.Forms.Label label1;
                private System.Windows.Forms.ComboBox comboBoxEncoding;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        System.Configuration.AppSettingsReader configurationAppSettings = 
                        new System.Configuration.AppSettingsReader();
                        this.textURL = new System.Windows.Forms.TextBox();
                        this.button1 = new System.Windows.Forms.Button();
                        this.response = new System.Windows.Forms.TextBox();
                        this.label1 = new System.Windows.Forms.Label();
                        this.comboBoxEncoding = new System.Windows.Forms.ComboBox();
                        this.SuspendLayout();
                        // 
                        // textURL
                        // 
                        this.textURL.Location = new System.Drawing.Point(24, 8);
                        this.textURL.Name = "textURL";
                        this.textURL.Size = new System.Drawing.Size(328, 19);
                        this.textURL.TabIndex = 0;
                        this.textURL.Text = "";
                        // 
                        // button1
                        // 
                        this.button1.Location = new System.Drawing.Point(384, 8);
                        this.button1.Name = "button1";
                        this.button1.RightToLeft = System.Windows.Forms.RightToLeft.No;
                        this.button1.Size = new System.Drawing.Size(64, 24);
                        this.button1.TabIndex = 1;
                        this.button1.Text = "Get";
                        this.button1.Click += new System.EventHandler(this.OnGet);
                        // 
                        // response
                        // 
                        this.response.AcceptsReturn = true;
                        this.response.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                                | System.Windows.Forms.AnchorStyles.Left) 
                                | System.Windows.Forms.AnchorStyles.Right);
                        this.response.Location = new System.Drawing.Point(24, 72);
                        this.response.Multiline = true;
                        this.response.Name = "response";
                        this.response.ScrollBars = System.Windows.Forms.ScrollBars.Both;
                        this.response.Size = new System.Drawing.Size(424, 264);
                        this.response.TabIndex = 2;
                        this.response.Text = "";
                        this.response.WordWrap = false;
                        // 
                        // label1
                        // 
                        this.label1.Location = new System.Drawing.Point(32, 40);
                        this.label1.Name = "label1";
                        this.label1.Size = new System.Drawing.Size(64, 24);
                        this.label1.TabIndex = 4;
                        this.label1.Text = "Encoding";
                        // 
                        // comboBoxEncoding
                        // 
                        this.comboBoxEncoding.Items.AddRange(new object[] {
                        	"Shift JIS",
                        	"UTF-8",
                        	"UTF-7",
                        	"Unicode","EUC"});
                        this.comboBoxEncoding.Location = new System.Drawing.Point(96, 40);
                        this.comboBoxEncoding.Name = "comboBoxEncoding";
                        this.comboBoxEncoding.Size = new System.Drawing.Size(120, 20);
                        this.comboBoxEncoding.TabIndex = 5;
                        // 
                        // Form1
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(456, 350);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.comboBoxEncoding,
                        this.label1,
                        this.response,
                        this.button1,
                        this.textURL});
                        this.Name = "Form1";
                        this.Text = "WebAccess";
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private void OnGet(object sender, System.EventArgs e)
                {
                        System.IO.Stream stream = null;
                        System.IO.StreamReader textReader = null;

                        // 現在のカーソルを保存しておく。
                        Cursor cursor = this.Cursor;

                        // 使用するエンコーディングを ListBoxから取得する。
                        // System.Text.Encoding.Default は、Shift JIS
                        System.Text.Encoding enc = System.Text.Encoding.Default;
                        if (this.comboBoxEncoding.Text == "Shift JIS")
                                enc = System.Text.Encoding.Default;
                        else if (this.comboBoxEncoding.Text == "UTF-8")
                                enc = System.Text.Encoding.UTF8;
                        else if (this.comboBoxEncoding.Text == "UTF-7")
                                enc = System.Text.Encoding.UTF7;
                        else if (this.comboBoxEncoding.Text == "Unicode")
                                enc = System.Text.Encoding.Unicode;
                        else if (this.comboBoxEncoding.Text == "EUC")
                                enc = System.Text.Encoding.GetEncoding("euc-jp");
                        else
                                enc = System.Text.Encoding.Default;

                        try 
                        {
                                // カーソルを WaitCursor にする。
                                this.Cursor = Cursors.WaitCursor;

                                System.Net.WebRequest req = HttpWebRequest.Create(this.textURL.Text);
                                WebResponse res = req.GetResponse();

                                // HttpWebRequest からストリームを取得する。
                                stream = res.GetResponseStream();
                                // 1行ごとに扱いたいので、StreamReader にする。
                                textReader = new System.IO.StreamReader(stream, enc);
                                String str;

                                // 高速化のため、StringBuilder を使う。
                                System.Text.StringBuilder text = new System.Text.StringBuilder("");
                                while( true )
                                {
                                        str = textReader.ReadLine();
                                        if (str == null)
                                                break;
                                        // TextBoxの改行は "\r\n"。 "\n"だけでは改行しない。
                                        text.Append( str + "\r\n");
                                }
                                // StringBuilder で全テキストを構成後にTextBoxに貼り付ける。
                                this.response.Text = text.ToString();
                        }
                        catch (Exception exc)
                        {       
                                // フォーマットエラーなどの例外処理
                                MessageBox.Show(exc.Message, this.Name, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                throw exc;
                        }
                        finally
                        {
                                textReader.Close();
                                stream.Close();
                                // カーソルを元に戻す。
                                this.Cursor = cursor;
                        }
                }
        }
}