欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

asp.net URL中包含中文參數(shù)造成亂碼的解決方法

 更新時(shí)間:2010年03月08日 21:44:27   作者:  
中文亂碼一直以來是WEB開發(fā)中比較常見的問題之一,對(duì)于初學(xué)者來說,各種各樣的編碼方式可能會(huì)有點(diǎn)不適應(yīng),本篇文章并不講述這些編碼,而是把自己遇到的一個(gè)小問題以及該問題的解決之法說明一下,希望對(duì)大家有用。
問題:
  前段時(shí)間,在系統(tǒng)中做了一個(gè)類似于友情鏈接的功能塊,一直運(yùn)行良好,直到有一天加了類似于以下的鏈接地址:http://www.****.com/user.aspx?id=水天,就出現(xiàn)大問題了:
 ?。薄模桑诺刂窓谥兄苯虞斎脒@個(gè)地址,訪問沒錯(cuò);
 ?。?、做一個(gè)靜態(tài)頁(yè),其中包括這個(gè)超鏈接,點(diǎn)擊訪問也沒錯(cuò);
 ?。?、就是把這個(gè)鏈接添加到這個(gè)功能塊中,點(diǎn)擊訪問那邊接收到的是亂碼。
  一開始,被這個(gè)問題也搞得頭大,在google了一把后,總算是把問題給搞清楚了,其實(shí)只要這個(gè)鏈接地址不經(jīng)過任何編碼傳遞是不會(huì)有問題的。但就是加到了這個(gè)功能塊后,再點(diǎn)擊,雖然這個(gè)時(shí)候在IE地址欄里顯示的還是"http://www.****.com/user.aspx?id=水天",但真正傳遞過去的參數(shù)"水天"其實(shí)已經(jīng)經(jīng)過類似于Server.UrlEncode的操作了,當(dāng)然默認(rèn)是utf-8編碼,正是由于這個(gè)原因,如果對(duì)方系統(tǒng)不進(jìn)行相應(yīng)的解碼,直接操作該參數(shù),就產(chǎn)生了以上的錯(cuò)誤。
  解決方法:
  網(wǎng)上有很多解決之道,最常見的莫過于以下幾點(diǎn):
 ?。薄⒃趙eb.config里配制<globalization requestEncoding="gb2312" responseEncoding="gb2312" />,這個(gè)方法確實(shí)可行,但我想很多人不想用這種方法來解決,把整個(gè)項(xiàng)目的請(qǐng)求和回應(yīng)都定為gb2312,我覺得不是一個(gè)好辦法,有點(diǎn)本末倒置了,畢竟這會(huì)導(dǎo)致很多其它問題的出現(xiàn)。
 ?。?、把要包含該鏈接的aspx文檔,修改其charset屬性為gb2312。這個(gè)方法到也可以接受,不過對(duì)于該文中的問題還不是最好的方法,因?yàn)樵摴δ軌K是可以動(dòng)態(tài)添加到任何頁(yè)面的,難道要去修改所有的頁(yè)面?想想還是不太合適。
 ?。?、直接用Server.UrlEncode和Server.Decode進(jìn)行加碼和解碼操作,這種方法對(duì)于發(fā)送方和接收方都在一個(gè)項(xiàng)目中是可行的,現(xiàn)在的問題是,我們要隨意去訪問別人的系統(tǒng),所以只能棄用此方法了。
  4、采用HttpUtility.UrlEncode(query, System.Text.Encoding.GetEncoding("GB2312"));對(duì)鏈接中的參數(shù)值進(jìn)行g(shù)b2312的編碼,這種方法,對(duì)方不用進(jìn)行任何解碼操作,直接接收參數(shù)則不會(huì)出現(xiàn)亂碼。
  一般提到最多的也就上面4種方法,其它的也跟這些大同小異。仔細(xì)分析后,覺得還是第4種方法最適合解決當(dāng)前問題,把中文參數(shù)進(jìn)行如4中的操作。但又出現(xiàn)另外一個(gè)問題,由于這是一個(gè)用戶可以自由輸入鏈接地址的功能,所以首先要做的就是得先分析這些鏈接URL,解析出參數(shù),再對(duì)這些參數(shù)進(jìn)行4中操作,然后再合拼成原來的URL地址。
  幸虧,URL參數(shù)解析C#已經(jīng)有類庫(kù)的支持,不用再去寫那些復(fù)雜的正則表達(dá)式來匹配了。這里我也不詳細(xì)說了,直接貼出原碼:
復(fù)制代碼 代碼如下:

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;
}

  這里我是把所有的參數(shù)都進(jìn)行g(shù)b2312編碼操作了,反正參數(shù)如果是英文或者是數(shù)字,經(jīng)過這些操作后還是不變的。

相關(guān)文章

最新評(píng)論