午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    asp.net querystring亂碼解決方法
    來源:易賢網(wǎng) 閱讀:737 次 日期: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國(guó)考·省考課程試聽報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(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)