国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:26:36
字體:
供稿:網(wǎng)友
問題:
  前段時(shí)間,在系統(tǒng)中做了一個(gè)類似于友情鏈接的功能塊,一直運(yùn)行良好,直到有一天加了類似于以下的鏈接地址:****.com/user.aspx?id=水天,就出現(xiàn)大問題了:
  1、從IE地址欄中直接輸入這個(gè)地址,訪問沒錯(cuò);
  2、做一個(gè)靜態(tài)頁,其中包括這個(gè)超鏈接,點(diǎn)擊訪問也沒錯(cuò);
  3、就是把這個(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):
  1、在web.config里配制<globalization requestEncoding="gb2312" responseEncoding="gb2312" />,這個(gè)方法確實(shí)可行,但我想很多人不想用這種方法來解決,把整個(gè)項(xiàng)目的請(qǐng)求和回應(yīng)都定為gb2312,我覺得不是一個(gè)好辦法,有點(diǎn)本末倒置了,畢竟這會(huì)導(dǎo)致很多其它問題的出現(xiàn)。
  2、把要包含該鏈接的aspx文檔,修改其charset屬性為gb2312。這個(gè)方法到也可以接受,不過對(duì)于該文中的問題還不是最好的方法,因?yàn)樵摴δ軌K是可以動(dòng)態(tài)添加到任何頁面的,難道要去修改所有的頁面?想想還是不太合適。
  3、直接用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)有類庫的支持,不用再去寫那些復(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)過這些操作后還是不變的。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌兰察布市| 潞城市| 南安市| 永安市| 霍邱县| 曲松县| 天台县| 保山市| 木里| 溧水县| 临湘市| 全椒县| 临安市| 库伦旗| 大新县| 抚州市| 应用必备| 壤塘县| 图们市| 吉林省| 白山市| 革吉县| 英吉沙县| 海门市| 隆尧县| 会昌县| 故城县| 新沂市| 洛宁县| 微博| 岳阳市| 葫芦岛市| 黑山县| 新巴尔虎左旗| 武威市| 达日县| 松阳县| 松阳县| 红桥区| 霍城县| 清水河县|