自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASP.NET QueryString亂碼解決問題

開發(fā) 后端
本文介紹了通過不同字符編碼間強制轉(zhuǎn)換來解決ASP.NET 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亂碼。

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

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

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

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

  1. HttpUtility.UrlDecode(s, Encoding.UTF8); 

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

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

  1. public NameValueCollection QueryString {  
  2.           get {   
  3.               if (_queryString == null) {  
  4.                   _queryString = new HttpValueCollection();   
  5.  
  6.                   if (_wr != null)  
  7.                       FillInQueryStringCollection();   
  8.  
  9.                   _queryString.MakeReadOnly();  
  10.               }  
  11.  
  12.               if (_flags[needToValidateQueryString]) {  
  13.                   _flags.Clear(needToValidateQueryString);   
  14.                   ValidateNameValueCollection(_queryString, "Request.QueryString");   
  15.               }  
  16.  
  17.               return _queryString;  
  18.           }  
  19.       }  

 

  1. private void FillInQueryStringCollection()  
  2. {  
  3.     byte[] queryStringBytes = this.QueryStringBytes;  
  4.     if (queryStringBytes != null)  
  5.     {  
  6.         if (queryStringBytes.Length != 0)  
  7.         {  
  8.             this._queryString.FillFromEncodedBytes(queryStringBytes, this.QueryStringEncoding);  
  9.         }  
  10.     }  
  11.     else if (!string.IsNullOrEmpty(this.QueryStringText))  
  12.     {  
  13.         this._queryString.FillFromString(this.QueryStringText, truethis.QueryStringEncoding);  
  14.     }  
  15. }  

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

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

  1. Type type = Request.GetType();  
  2.         PropertyInfo property = type.GetProperty("QueryStringBytes",  
  3.             BindingFlags.Instance  | BindingFlags.IgnoreCase | BindingFlags.NonPublic);  
  4.         byte[] queryBytes = (byte[])property.GetValue(Request, null);  
  5.         string querystring = HttpUtility.UrlDecode(queryBytes, Encoding.UTF8);  

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

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

【編輯推薦】

  1. ASP.NET DetailsView中顯示選中產(chǎn)品的詳細信息
  2. ASP.NET 2.0數(shù)據(jù)教程:GridView選擇行
  3. ASP.NET 2.0數(shù)據(jù)教程:GridView顯示數(shù)據(jù)
  4. ASP.NET 2.0中添加GridView到頁面
  5. 新增ASP.NET頁面時的注意事項
責任編輯:book05 來源: cnblogs
相關(guān)推薦

2009-07-24 11:24:33

ASP.NET中文亂碼

2009-07-23 10:06:29

2009-08-25 17:42:41

ASP.NET新手問題

2009-04-17 09:36:25

ASP.NETOracleWinform

2009-08-06 15:56:40

ASP.NET Coo

2009-07-22 17:45:35

ASP.NET教程

2009-08-03 14:22:33

什么是ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2011-06-30 14:16:25

QT 中文 亂碼

2009-07-22 18:02:26

ASP.NET Ses

2009-07-29 16:31:39

ASP.NET安裝部署

2009-03-17 10:04:40

TemplateAJAXASP.NET

2009-08-05 18:47:55

ASP.NET服務(wù)器

2009-07-30 13:42:28

ASP.NET報表問題ASP.NET

2009-07-22 17:37:06

ASP.NET Ses

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入門教程

2009-07-29 14:02:41

ASP.NET項目

2009-07-22 17:50:14

2009-07-23 16:53:17

ASP.NET中文變問

2010-09-02 15:18:42

CSSASP.NET
點贊
收藏

51CTO技術(shù)棧公眾號