- PR -

ポストバックイベント前後でHTTPクエリ文字列が変わってしまう

投稿者投稿内容
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-08-14 15:21
ん?

問題のクエリの"%uXXXX"って形式、
HttpUtility.UrlEncodeUnicodeがこの形式で吐きます。

意味は予想付くので気にしてませんでしたが、
ASP以外で見たことないです。

ざっと見たところRFC3986にもありません。
IIS独自拡張でしょうか。

だとしたら随分ひどいなぁ。

[追記]
IIS独自拡張のようです。
CodeRedで使われた拡張でした。懐かしい。

[ メッセージ編集済み 編集者: れい 編集日時 2007-08-14 15:44 ]
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-08-14 18:20
引用:

私の書き込み (2007-08-14 13:01) より:
引用:

Hildaさんの書き込み (2007-08-14 10:57) より:
強制的にutf-8固定にする方法はありませんでしょうか。



以前調べましたが、
まともな方法では無理っぽいです。



自分で無理と書いておいてなんですが。
まともかどうかはわかりませんが、一応出来ました。

Page.Renderのオーバーライドと
HtmlTextWriterのラップを使いました。

手抜きで正規表現使ってますし、
エラーチェックとか何もしていないので、
使うなら直してから使ってください。

コード:
Partial Public Class _Default
    Inherits System.Web.UI.Page

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.Render(New ActionAttributeFixedHtmlTextWriter(writer))
    End Sub

End Class

Public Class ActionAttributeFixedHtmlTextWriter
    Inherits HtmlTextWriter
    Private uencoderegex As Regex

    Sub New(ByVal original As HtmlTextWriter)
        MyBase.New(original.InnerWriter)
        uencoderegex = New Regex("%u[0-9a-f]{4}", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    End Sub

    Public Overrides Sub WriteAttribute(ByVal name As String, ByVal value As String, ByVal fEncode As Boolean)
        If name.ToLower = "action" Then
            value = uencoderegex.Replace(value, New MatchEvaluator(AddressOf UEncodeEvaluator))
        End If
        MyBase.WriteAttribute(name, value, fEncode)
    End Sub

    Private Function UEncodeEvaluator(ByVal match As Match) As String
        Return HttpUtility.UrlEncode(HttpUtility.UrlDecode(match.Value), System.Text.Encoding.UTF8)
    End Function

End Class

Hilda
常連さん
会議室デビュー日: 2006/02/12
投稿数: 37
投稿日時: 2007-08-19 17:01
れいさん 何度も書き込みありがとうございました。
返信が遅くなり申し訳ありませんでした。

formのactionのURLはやっぱり固定になってしまうのですね。
であれば、言ってもしょうがないことですが、やっぱりweb.configでエンコード形式をutf-8に設定できるなら、POSTするURLもその値にあわせてほしかったです・・・。

れいさんにご紹介いただいた方式ですと、RenderでFormのactionを強制的にUTF-8に変換するということですよね。
こちらの修正方法で対応するか、それともすべてutf-16に変換するか、修正量やテストの時間も考えて検討させていただきます。

どうもありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)