国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - asp.net querystring亂碼解決方法

asp.net querystring亂碼解決方法

2019-11-28 12:37ASP.NET教程網(wǎng) ASP.NET教程

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

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

對于GB2312的網(wǎng)站如果直接用javascript進行ajax數(shù)據(jù)提交,例如:http://www.xxx.com/accept.aspx?name=張三,或者說在UTF8的網(wǎng)站上用以下asp.net的代碼進行提交,也是不行的,會導致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)把編碼轉換這塊封裝好了。

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

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

 

復制代碼代碼如下:

HttpUtility.UrlDecode(s, Encoding.UTF8); 

 

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

第二種:比較另類一些,直接讀取客戶端提交的字節(jié)數(shù)據(jù)進行轉換,之所以Request.QueryString["name"]會是亂碼,是MS根據(jù)當前頁面的編碼進行轉換導致的,例如當前頁面編碼是GB2312,而人家提交的是UTF8,你沒用人家提交的UTF8編碼轉當然是亂碼,并不是人家傳過來就是亂碼。這時我們需要得到原始數(shù)據(jù)進行重新解碼來避免querystring亂碼,非常遺憾的是我并沒有找到直接提供頭部原始字節(jié)數(shù)據(jù)方法給我們用,沒關系,解剖下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是在第一次被訪問時才初始化的,如果你的程序中沒有用到它,那個這個對象會一直保持空值,MS考慮了細節(jié)

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

 

復制代碼代碼如下:

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: а天堂中文最新一区二区三区 | 黄色一级视频在线观看 | 国产一区二区精品在线观看 | 亚洲日韩中文字幕在线播放 | 国产精品2 | 精品国产乱码久久久久久影片 | 久久综合亚洲 | 亚洲精品国产第一综合99久久 | 91av爱爱| 日韩成人在线播放 | 亚洲成年人影院 | 日本黄色一区 | 日韩中文字幕一区二区 | 日韩毛片免费视频一级特黄 | 免费看的av | 中文字幕免费中文 | 在线观看免费视频国产 | 午夜视频一区 | 久久久www免费人成精品 | 国产免费高清 | 国产不卡免费视频 | 性做久久久久久 | 久久视频免费看 | 黄色一级毛片 | 精品国产乱码久久久久久久软件 | 欧美日韩在线看 | www.久久99| 亚洲免费在线播放 | 亚洲国产精品网站 | 肌肉男gay网站 | 精品国产欧美一区二区 | 三区视频 | 精品久久久久久国产 | 久久久99精品免费观看 | www久久精品 | 在线一区二区三区 | 亚洲精品久久久久久久久久久久久 | 精品日韩一区二区 | 人人爽视频 | 久久国产精品一区 | 欧美日韩精品在线观看 |