asp.net querystring亂碼解決方法
來源:易賢網(wǎng) 閱讀:715 次 日期:2014-10-11 16:18:16
溫馨提示:易賢網(wǎng)小編為您整理了“asp.net querystring亂碼解決方法”,方便廣大網(wǎng)友查閱!

GB2312的網(wǎng)站如果直接用javascript進(jìn)行ajax數(shù)據(jù)提交,會(huì)導(dǎo)致querystring亂碼,下面提供一下解決方法

正常的情況下,現(xiàn)在asp.net的網(wǎng)站很多都直接使用UTF8來進(jìn)行頁面編碼的,這與Javascript缺省網(wǎng)站的編碼是相同的,但是也有相當(dāng)一部分采用GB2312

對(duì)于GB2312的網(wǎng)站如果直接用javascript進(jìn)行ajax數(shù)據(jù)提交,例如:http://www.xxx.com/accept.aspx?name=張三,或者說在UTF8的網(wǎng)站上用以下asp.net的代碼進(jìn)行提交,也是不行的,會(huì)導(dǎo)致querystring亂碼。

代碼如下:

WebRequest request = WebRequest.Create("http://www.xxx.com/accept.aspx?name=張三");

request.Method = "POST";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

這樣在GB2312編碼的網(wǎng)站下得到Request.QueryString["name"]是亂碼,MS已經(jīng)把編碼轉(zhuǎn)換這塊封裝好了。

在UTF8編碼通訊和GB2312網(wǎng)站通訊方式下的編碼轉(zhuǎn)換方式有很多種實(shí)現(xiàn):

第一種:首先對(duì)要傳輸?shù)淖址M(jìn)行UrlEncode,這種編碼后的字符在解碼時(shí)用UTF8編碼方式進(jìn)行手工解碼,這樣保證結(jié)果一致,即使傳輸給的目標(biāo)頁面時(shí)GB2312,結(jié)果都是一樣的,避免了querystring亂碼。解碼方式如下代碼。

代碼如下:

HttpUtility.UrlDecode(s, Encoding.UTF8);

這樣可以得到正確的張三,這要求在提交的時(shí)候先進(jìn)行HttpUtility.UrlEncode編碼成UTF8先,然后再放到name=(編碼后的字符),這也是目前比較常用和普遍的解決方式,只是缺點(diǎn)有一個(gè)就是要告訴別人你先怎么怎么Url編碼先,然后再怎么怎么。

第二種:比較另類一些,直接讀取客戶端提交的字節(jié)數(shù)據(jù)進(jìn)行轉(zhuǎn)換,之所以Request.QueryString["name"]會(huì)是亂碼,是MS根據(jù)當(dāng)前頁面的編碼進(jìn)行轉(zhuǎn)換導(dǎo)致的,例如當(dāng)前頁面編碼是GB2312,而人家提交的是UTF8,你沒用人家提交的UTF8編碼轉(zhuǎn)當(dāng)然是亂碼,并不是人家傳過來就是亂碼。這時(shí)我們需要得到原始數(shù)據(jù)進(jìn)行重新解碼來避免querystring亂碼,非常遺憾的是我并沒有找到直接提供頭部原始字節(jié)數(shù)據(jù)方法給我們用,沒關(guān)系,解剖下MS的源代碼,發(fā)現(xiàn)代碼如下:

代碼如下:

public NameValueCollection QueryString {

get {

if (_queryString == null) {

_queryString = new HttpValueCollection();

if (_wr != null)

FillInQueryStringCollection();

_queryString.MakeReadOnly();

}

if (_flags[needToValidateQueryString]) {

_flags.Clear(needToValidateQueryString);

ValidateNameValueCollection(_queryString, "Request.QueryString");

}

return _queryString;

}

}

代碼如下:

private void FillInQueryStringCollection()

{

byte[] queryStringBytes = this.QueryStringBytes;

if (queryStringBytes != null)

{

if (queryStringBytes.Length != 0)

{

this._queryString.FillFromEncodedBytes(queryStringBytes, this.QueryStringEncoding);

}

}

else if (!string.IsNullOrEmpty(this.QueryStringText))

{

this._queryString.FillFromString(this.QueryStringText, true, this.QueryStringEncoding);

}

}

順便說一下,QueryString是在第一次被訪問時(shí)才初始化的,如果你的程序中沒有用到它,那個(gè)這個(gè)對(duì)象會(huì)一直保持空值,MS考慮了細(xì)節(jié)

大家都看到了QueryStringBytes屬性,原型如下internal byte[] QueryStringBytes,這個(gè)就是原始的QueryString字節(jié)了。出招了:

復(fù)制代碼 代碼如下:

Type type = Request.GetType();

PropertyInfo property = type.GetProperty("QueryStringBytes",

BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.NonPublic);

byte[] queryBytes = (byte[])property.GetValue(Request, null);

string querystring = HttpUtility.UrlDecode(queryBytes, Encoding.UTF8);

再看看querystring是什么,哈哈name=張三。

各種編碼的轉(zhuǎn)換都可以自己完成,畢竟得到提交的原始字節(jié)了,希望對(duì)大家解決querystring亂碼問題有所幫助。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:asp.net querystring亂碼解決方法
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)