2008.01.09

System.Web.HttpUtility.UrlEncodeで文字化け

Webアプリケーションで、画面遷移などパラメータの受け渡しを行う際には、
情報が正しく受け渡せるようURLエンコードを行います。

ASP.NETでURLエンコードを行うには、
下記の2つのメソッドが使用できます。

1.Server.UrlEncode
2.System.Web.HttpUtility.UrlEncode

どちらも引数にString型を指定でき、
違いがわかりにくいのですが、
Server.UrlEncodeを使うことをすすめます。
というのも、URLエンコードは、文字コードによって変換方法が違うのですが、
HttpUtility.UrlEncodeでは、Web.configに指定された文字コードに関わらず、
常に「UTF-8」でエンコードしてしまう
からです。

例えば、Web.configに、以下の「Shift-JIS」が指定されていたとします。


<globalization requestEncoding="Shift-JIS" responseEncoding="Shift-JIS" responseHeaderEncoding="Shift-JIS"/>

その状態で、TEST1.aspxから、TEST2.aspxへ、パラメータを渡して画面遷移するとします。


渡す側
<TEST1.aspx>

'コード1  Server.UrlEncode
Response.Redirect("TEST2.aspx?testparam=" & Server.UrlEncode("アイロベックステスト"))

'コード2  HttpUtility.UrlEncode
Response.Redirect("TEST2.aspx?testparam=" & HttpUtility.UrlEncode("アイロベックステスト"))


受け取り側
<TEST2.aspx>

'パラメータを出力
Response.Write(Request.Params("testparam"))

上記のコードの場合、「コード1  Server.UrlEncode」では問題なく画面表示されますが、
「コード2  HttpUtility.UrlEncode」では文字化けします。
(「UTF-8」でエンコードされているのを「Shift-JIS」で表示しようとするため)

この場合のように、そもそも「Shift-JIS」のシステムであれば、
すぐに文字化けに気づくので、まだ良いのですが、
「UTF-8」で作成した場合は、どちらでも正常に動作します。
そのため、文字コードを「UTF-8」から「Shift-JIS」に変更することになり、
Web.configを変更したときに初めて文字化けが発生することになります。

基本的に、Server.UrlEncodeを使用しておけば発生しない問題です。
HttpUtility.UrlEncodeは、引数に文字コードを指定できますので、
Web.configによらない文字コードを指定したい、特別な場合のみ使用すると良いでしょう。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
takefuji