demoshop

demo, trying to be the best_

最近在寫一個程式需要接受其他方 Post 過來的參數,但是對方傳過來的參數編碼是 Big5 而 ASP.NET MVC 是 UTF8 ,而且程式會很好心的在接收的時候自動轉 UTF8 (可是沒轉成功...) 因此導致 demo 接到參數後也無能為力,因為結構已經被破壞了,既然底層不行,那就只好從源頭去找。

簡單來看一下圖就知道我遇到的問題啦

一開始我是很自然的想說就直接將 Big5 轉 UTF8就解決了,沒想到轉出來的就都是???,後來想想可能是接值的時候就已經錯了,當成UTF8來接導致於已經壞掉了,就在有點不知所措的時候對於字元編碼相當有研究的黑暗大上線了,詢問之下得到了關鍵字 Request.InputStream 。主要的原理就是取得原始的資料後再執行轉換編碼的動作以下就是完整的 Code

建立一個專門的方法方便使用
private static NameValueCollection GetEncodedForm(System.IO.Stream stream, Encoding encoding)
{
        System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.ASCII);
        return GetEncodedForm(reader.ReadToEnd(), encoding);
}

private static NameValueCollection GetEncodedForm(string urlEncoded, Encoding encoding)
{
        NameValueCollection form = new NameValueCollection();
        string[] pairs = urlEncoded.Split("&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

        foreach (string pair in pairs)
        {
                string[] pairItems = pair.Split("=".ToCharArray(), 2, StringSplitOptions.RemoveEmptyEntries);
                string name = HttpUtility.UrlDecode(pairItems[0], encoding);
                string value = (pairItems.Length > 1) ? HttpUtility.UrlDecode(pairItems[1], encoding) : null;
                form.Add(name, value);
        }
        return form;
}

使用時就很直覺啦
postValues = GetEncodedForm(Request.InputStream, Encoding.GetEncoding("ISO-8859-1"));


回應討論