2013年5月22日水曜日

VB URL の % 付き文字列を日本語で表示

前から気になっていました。 アドレスの中の % 付き文字列。
日本語等を UTF-8 で変換した時の文字列 という理解はしてますが、どうもピンと来ない。
やはり、分る形で見て見たい。
そこで、プログラミング。


作って見る気になった理由は、Blogger のラベルを付けた 別の投稿  で書いてます。

さて、VB でのプログラミングをご紹介。

ひとつの Form に、TextBox を 3 つ ( うちひとつは .Multiline = True , .ScrollBars = Vertical ) 、
Label を 3 つ以上適宜、 Button を 3 つ、CheckBox を 1 つ 用意します。

アプリの仕様は、アドレス(以下 URL と呼称)を TextBox で指定し、これの値が変わった時に、
別の TextBox でURL Decode した文字列(日本語等が普通に表示される)を表示します。
これと同時に、URL の中のクエリ文字列を別掲します。
クエリ文字列が長い場合は複数の条件が入っている場合が多く、見難くなる事が考えられるので、
CheckBox を用意し、この値によって、複数行に分割しての表示が出来るようにします。
また、指定は手入力以外に、クリップボード経由、DragDrop も考慮します。
   注: Browser の AddressBar からは DragDrop 可能ですが、
       Browser の Body 内のリンク文字列は Browser 外に Drag 出来ないようです。
       (私の知識不足か? IE10 の場合、保護モード有効下での挙動(仕様?)のようです。 怖いので試してませんけど。

さて、コードは以下に。

Public Class Form1
    Private uriQuery As String = ""
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.AllowDrop = True                     ' for DragDrop
        ' Browser のリンクからの取得の確認用    ' 結局、出来ず、断念! DragDrop は赤い STOP 印になり Browser の外に出られない
        ' Me.ListBox1.Visible = False             ' 本来、不要なコントロール 挑戦の記念に 削除せず保留

    End Sub
    Private Sub Button2Clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2Clear.Click
        Me.TextBox1URLOriginal.Text = Nothing
        Me.TextBox2URLDecorded.Text = Nothing
        Me.TextBox3QueryDecode.Text = Nothing
    End Sub
    Private Sub Button1Close_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1Close.Click
        Me.Close()
    End Sub
    Private Sub TextBox1URLOriginal_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1URLOriginal.TextChanged
        If Not Me.TextBox1URLOriginal.Text = Nothing Then
            Me.TextBox2URLDecorded.Text = Uri.UnescapeDataString(Me.TextBox1URLOriginal.Text)
            Try
                Dim url As String = Me.TextBox1URLOriginal.Text
                Dim uTarget As New Uri(url)
                uriQuery = Uri.UnescapeDataString(uTarget.Query)
                ChangeUriQueryLine()
            Catch ex As Exception               ' 無効な URL 入力・編集時
                Me.TextBox3QueryDecode.Text = Nothing
            End Try
        Else
            Me.TextBox3QueryDecode.Text = Nothing
        End If
    End Sub
    Private Sub CheckBox1MultiLine_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1MultiLine.CheckedChanged
        ChangeUriQueryLine()
    End Sub
    Private Sub ChangeUriQueryLine()
        ' (uri) Query を表示形式変更
        If Me.CheckBox1MultiLine.Checked Then
            Me.TextBox3QueryDecode.Text = uriQuery.Replace("&", vbCrLf & "&")
        Else
            Me.TextBox3QueryDecode.Text = uriQuery
        End If
    End Sub
    Private Sub Button3ClipBoard_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3ClipBoard.Click
        If Clipboard.ContainsText() Then
            Me.TextBox1URLOriginal.Text = Clipboard.GetText()
        End If
    End Sub                                     ' ClipBoard Get Text Cording
    Private Sub Form1_DragEnter(ByVal sender As System.Object, _
                             ByVal e As System.Windows.Forms.DragEventArgs) _
                             Handles MyBase.DragEnter
        'Me.AllowDrop = True                    ' On Loading
        ' DataFormats の種類を表示 for Debug
        'Dim eCheck() As String = e.Data.GetFormats()
        'Me.ListBox1.Items.Clear()
        'For Each eCheckItem In eCheck
        '    Me.ListBox1.Items.Add(eCheckItem)
        'Next

        'URLのみ受入
        If e.Data.GetDataPresent("UniformResourceLocator") Or _
           e.Data.GetDataPresent("UniformResourceLocatorW") Then
            e.Effect = DragDropEffects.Link
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub                                     ' DragDrop Cording(1/2)
    Private Sub Form1_DragDrop(ByVal sender As System.Object, _
                               ByVal e As System.Windows.Forms.DragEventArgs _
                             ) Handles MyBase.DragDrop
        Dim urlFrom As String = e.Data.GetData(DataFormats.Text).ToString() ' URL 文字列で取得
        Me.TextBox1URLOriginal.Text = urlFrom
    End Sub                                     ' DragDrop Cording(2/2)
End Class
一部、余計なコードが残ってますが、奮闘の記録として残して置きます。 (上記 緑の部分) 参考になさる方は削除して下さい。
各コントロールの名称は、標準状態の名称の後に 用途を示す語句を追加した 名称に変更してあります。
 ( 例: TextBox1 > TextBox1URLOriginal ) ご注意下さい。
上述の名称さえ気をつければ、 デザイナでコントロール貼り付け後、Form1.vb にそのまま貼り付けて実行可能なコードです。

実行時の画面です。
使ってみて、検索情報の入った URL って、あぁ~ こんなだったのか って言うのが 素直な感想です。



0 件のコメント:

コメントを投稿