ASP.NET Shift_JISでPOSTされた値をUTF-8のシステムで受け取る
文字コードがShift_JISの画面で、UTF-8の文字コードで動いているシステムにPOSTしたとき、UTF-8のシステムのサーバー処理で、POSTした内容を取得する方法を紹介します。
文章にするとわかりづらいですが、以下ようなフォームをsubmitしたとき、UTF-8のシステムでPOSTされたhid1の内容を取得する方法です。(サーバー処理はASP.NET(VB.NET)です)
Shift_JISの画面<form action="UTF-8のシステムのURL">
<input type="hidden" name="hid1" value="日本語の文字列テスト">
</form>文字化けする方法
以下のように、普通に取得すると文字化けしてしまいます。
Dim str As String
str = Request.Form("hid1")
Console.Write(str) '文字化け対処法
Request.Fromで取得すると、Shift_JISの文字列をUTF-8の形式で取得しようとするため、文字化けしてしまいます。
Shift_JISの形式で取得するために、HttpUtility.ParseQueryStringを使用します。
HttpUtility.ParseQueryString(クエリ文字列, 文字コード)の形式で指定すると、指定した文字コードでクエリ文字列をkey-valueに変換します。
POSTされた値を文字列で取得するにはRequest.BinaryReadを使用します。
最終的には以下のようになります。
'POSTされたクエリ文字列を取得
Dim bs As Byte() = Request.BinaryRead(Request.ContentLength)
Dim qs As String = Encoding.UTF8.GetString(bs)
'クエリ文字列をShift_JISでkey-valueに変換
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(qs, Encoding.GetEncoding("shift_jis"))
Dim str As String
If Not qscoll("hid1") Is Nothing Then
str = qscoll("hid1")
Console.Write(str) '日本語の文字列テスト
End If