zukucode
主にWEB関連の情報を技術メモとして発信しています。

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

関連記事