asp.net URL中包含中文參數造成亂碼的解決方案

來源:互聯網
上載者:User

問題:
  前段時間,在系統中做了一個類似於友情連結的功能塊,一直運行良好,直到有一天加了類似於以下的連結地址:http://www.****.com/user.aspx?id=水天,就出現大問題了:
  1、從IE地址欄中直接輸入這個地址,訪問沒錯;
  2、做一個靜態頁,其中包括這個超連結,點擊訪問也沒錯;
  3、就是把這個連結添加到這個功能塊中,點擊訪問那邊接收到的是亂碼。
  一開始,被這個問題也搞得頭大,在google了一把後,總算是把問題給搞清楚了,其實只要這個連結地址不經過任何編碼傳遞是不會有問題的。但就是加到了這個功能塊後,再點擊,雖然這個時候在IE地址欄裡顯示的還是"http://www.****.com/user.aspx?id=水天",但真正傳遞過去的參數"水天"其實已經經過類似於Server.UrlEncode的操作了,當然預設是utf-8編碼,正是由於這個原因,如果對方系統不進行相應的解碼,直接操作該參數,就產生了以上的錯誤。
  解決方案:
  網上有很多解決之道,最常見的莫過於以下幾點:
  1、在web.config裡配製<globalization requestEncoding="gb2312" responseEncoding="gb2312" />,這個方法確實可行,但我想很多人不想用這種方法來解決,把整個項目的請求和回應都定為gb2312,我覺得不是一個好辦法,有點本末倒置了,畢竟這會導致很多其它問題的出現。
  2、把要包含該連結的aspx文檔,修改其charset屬性為gb2312。這個方法到也可以接受,不過對於該文中的問題還不是最好的方法,因為該功能塊是可以動態添加到任何頁面的,難道要去修改所有的頁面?想想還是不太合適。
  3、直接用Server.UrlEncode和Server.Decode進行加碼和解碼操作,這種方法對於發送方和接收方都在一個項目中是可行的,現在的問題是,我們要隨意去訪問別人的系統,所以只能棄用此方法了。
  4、採用HttpUtility.UrlEncode(query, System.Text.Encoding.GetEncoding("GB2312"));對連結中的參數值進行gb2312的編碼,這種方法,對方不用進行任何解碼操作,直接接收參數則不會出現亂碼。
  一般提到最多的也就上面4種方法,其它的也跟這些大同小異。仔細分析後,覺得還是第4種方法最適合解決當前問題,把中文參數進行如4中的操作。但又出現另外一個問題,由於這是一個使用者可以自由輸入連結地址的功能,所以首先要做的就是得先分析這些連結URL,解析出參數,再對這些參數進行4中操作,然後再合拼成原來的URL地址。
  幸虧,URL參數解析C#已經有類庫的支援,不用再去寫那些複雜的Regex來匹配了。這裡我也不詳細說了,直接貼出原碼: 複製代碼 代碼如下:public static string InitChineseUrl(string chineseUrl)
{
Uri url = new Uri(chineseUrl);
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(url.Query, System.Text.Encoding.GetEncoding("utf-8"));
string query = "";
for (int i = 0; i < nv.Count; i++)
{
if (query.Trim() == string.Empty)
{
query = "?" + nv.Keys[i] + "=" + HttpUtility.UrlEncode(nv[i], System.Text.Encoding.GetEncoding("GB2312"));
}
else
{
query += "&" + nv.Keys[i] + "=" + HttpUtility.UrlEncode(nv[i], System.Text.Encoding.GetEncoding("GB2312"));
}
}
string u = chineseUrl.Split('?')[0] + query;
return u;
}

  這裡我是把所有的參數都進行gb2312編碼操作了,反正參數如果是英文或者是數字,經過這些操作後還是不變的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.