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