15 October 2008

(.NET C#) POSTでWebサーバにデータ送信時の文字コード UTF-8, Shift JIS

.NET C#を用いて、POSTでのWebサーバとのデータ送受信を行う。 WebサーバがUTF-8の場合と、Shift JISの場合のサンプルコード

(1) WebサーバがUTF-8の場合

C#は内部処理をUTF-8で行っているので、特に何も考えなければこの方法を用いるのが簡単。


string strUri = "http://192.168.1.1/test/test.cgi";
string strData = "送信したい文字列";
string resText; // 結果を受信する文字列

try
{
// ネットワークコネクションの定義
System.Net.WebClient wc = new System.Net.WebClient();
System.Collections.Specialized.NameValueCollection ps =
new System.Collections.Specialized.NameValueCollection();

// POSTで送信するデータセットを定義する (この方法ではUTF-8以外は送信できない!)
ps.Add("data", strData);
ps.Add("dummy", "dummy"); // data文字列に改行コードが付かないようにするためダミーを送信

// データの送信・応答を受信
byte[] resData = wc.UploadValues(strUri, ps);
// コネクションの破棄
wc.Dispose();

// 応答バイト列を、文字列に変換して格納
//UTF-8の場合
resText = System.Text.Encoding.UTF8.GetString(resData);
// SJISの場合(受信だけなら、この方式で問題ない)
// System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");
// resText = enc.GetString(resData);
}
catch
{ // ネットワークエラー
// エラー処理のコードを書く
}

(2) WebサーバがShift JISの場合

テキストバッファ enc のエンコード形式指定は、"shift_jis"のほか、"UTF-8"、"euc-jp" なども指定可能。(1)はUTF-8専用の方法だが、こちらの方法はどの文字コードにも対応できる。


string strUri = "http://192.168.1.1/test/test.cgi";
// SJIS用のテキストバッファ (バッファの文字コードはSJIS以外でも指定可能)
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");
// 送信するデータ
string strData = "送信したい文字列";
// 返信を受信するテキストバッファ (C#はデフォルトでUTF-8)
string resText;

// POSTするテキストを作成する(SJISで作成)
string strPostData = string.Format("data={0}&dummy=dummy",
System.Web.HttpUtility.UrlEncode(strData, enc));
// 「VisualStudioのプロジェクトで、System.Web.dll への参照を追加する」こと

byte[] resPostBytes = enc.GetBytes(strPostData);


try
{
// ネットワークコネクションの定義
System.Net.WebClient wc = new System.Net.WebClient();
// UTF-8以外はヘッダ情報が必要(URLエンコードして送信するため)
wc.Headers.Add("Content-Type","application/x-www-form-urlencoded");

// データの送信・応答を受信
byte[] resData = wc.UploadData(strUri, resPostBytes);
// コネクションの破棄
wc.Dispose();

// 応答バイト列を、文字列に変換して格納
resText = enc.GetString(resData);
}
catch
{ // ネットワークエラー
// エラー処理のコードを書く
}

なお、(2)の方法では、コンパイルのためには「System.Web.dll への参照を追加」を行う必要がある。

20081015-cs1.png
ソリューションエクスプローラで、プロジェクトを選択し、コンテキストメニューの「参照の追加」をクリックするか、「プロジェクト」メニューの「参照の追加」を実行する。

20081015-cs2.png
System.Web.dll をクリックして、「選択」ボタンを押して、ダイアログ下の選択フィールドに追加する。