2011年9月5日 星期一

透過HttpWebRequest類別POST編碼為Big5的資料到其他網站接收

最近遇到一個問題是要透過HttpWebRequest類別採post的方式將原本unicode的資料轉成big5編碼方式送出給遠端的Server,遠端Server會將接收到的欄位值發送簡訊至手機上。因為遠端Server的接收頁面採用Big5的編碼,且字串資料一律接使用Big5來處理。原本以為很簡單的只要將要處理的字串透過編碼轉換的方式轉成Big5後,就可以直接Post出去給遠端Server即可,但是發現遠端Server卻是一直接收到utf-8傳來亂碼,導致發送出來的簡訊都是亂碼。
後來參考保哥文章"關於個瀏覽器對網頁與文字編碼的處理規則研究整理"一文,以及另外一篇網路文章"C#, 使用 HttpWebRequest 向網站提交資料",終於把惱人的亂碼問題給解決掉。其實會一直失敗的原因主要是因為透過WebRequest.Create(requestUriString)時,requestUriString必須將字串進行UrlEncode為Big5碼的動作才行。
以下是自己的Post Big5碼資料的Method供參考
01/// <SUMMARY>
02/// This method is used to post data to remote host via WebRequest
03/// </SUMMARY>
04/// 
05private void postFormViaWebRequest(Dictionary<STRING,STRING> inpufFileds, string sendURL)
06{
07    Encoding encoding = Encoding.GetEncoding(950);
08    string postData = string.Empty;
09    foreach (KeyValuePair<STRING,STRING> kvp in inpufFileds)
10    {
11        postData += "&" + HttpUtility.UrlEncode(kvp.Key, encoding) + "=" + HttpUtility.UrlEncode(kvp.Value, encoding);
12    }
13    byte[] data = Encoding.ASCII.GetBytes(postData);
14    HttpWebRequest postRequest = (HttpWebRequest)WebRequest.Create(sendURL + "?");
15    postRequest.Method = "POST";
16    postRequest.ContentType = "application/x-www-form-urlencoded;charset=big5";
17    postRequest.ContentLength = data.Length;
18    Stream requestStream = postRequest.GetRequestStream();
19    requestStream.Write(data, 0, data.Length);
20    requestStream.Close();
21}</STRING,STRING></STRING,STRING>

沒有留言:

張貼留言