asp.net querystring亂碼解決方案_實用技巧

來源:互聯網
上載者:User

正常的情況下,現在asp.net的網站很多都直接使用UTF8來進行頁面編碼的,這與Javascript預設網站的編碼是相同的,但是也有相當一部分採用GB2312

對於GB2312的網站如果直接用javascript進行ajax資料提交,例如:http://www.xxx.com/accept.aspx?name=張三,或者說在UTF8的網站上用以下asp.net的代碼進行提交,也是不行的,會導致querystring亂碼。

複製代碼 代碼如下:

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

這樣在GB2312編碼的網站下得到Request.QueryString["name"]是亂碼,MS已經把編碼轉換這塊封裝好了。

在UTF8編碼通訊和GB2312網站通訊方式下的編碼轉換方式有很多種實現:

第一種:首先對要傳輸的字元進行UrlEncode,這種編碼後的字元在解碼時用UTF8編碼方式進行手工解碼,這樣保證結果一致,即使傳輸給的目標頁面時GB2312,結果都是一樣的,避免了querystring亂碼。解碼方式如下代碼。

複製代碼 代碼如下:

HttpUtility.UrlDecode(s, Encoding.UTF8);

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

第二種:比較另類一些,直接讀取用戶端提交的位元組資料進行轉換,之所以Request.QueryString["name"]會是亂碼,是MS根據當前頁面的編碼進行轉換導致的,例如當前頁面編碼是GB2312,而人家提交的是UTF8,你沒用人家提交的UTF8編碼轉當然是亂碼,並不是人家傳過來就是亂碼。這時我們需要得到未經處理資料進行重新解碼來避免querystring亂碼,非常遺憾的是我並沒有找到直接提供頭部原始位元組資料方法給我們用,沒關係,解剖下MS的原始碼,發現代碼如下:

複製代碼 代碼如下:

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是在第一次被訪問時才初始化的,如果你的程式中沒有用到它,那個這個對象會一直保持空值,MS考慮了細節

大家都看到了QueryStringBytes屬性,原型如下internal byte[] QueryStringBytes,這個就是原始的QueryString位元組了。出招了:

複製代碼 代碼如下:

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=張三。

各種編碼的轉換都可以自己完成,畢竟得到提交的原始位元組了,希望對大家解決querystring亂碼問題有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.