今天在使用Request.QueryString的時候,發現所有接收到的字符串,只要是帶中文的都會變成亂碼。後來經過研究,終於找到了原因。
ASP.NET默認使用的都是UTF-8編碼,而大家一般使用的都是GB2312編碼。這就是Request.QueryString時中文變成亂碼的原因所在,也因爲這樣,才爲大家帶來了很多麻煩。
下面我們來看兩個參數:“test.aspx?string=%b7%e7%a4%ce%ca%c0%bd%e7”和“test.aspx?string=%e9%a3%8e%e3%81%ae%e4%b8%96%e7%95%8c ”。粗略一看,這是給test.aspx頁面傳遞了兩個不一樣的參數,可是經過正確的URL反編碼後,可以發現這兩個其實是同一個參數:風の世界!爲什麼同一個參數會得到兩個不一樣的字符串呢?這是因爲第一個參數是用GB2312的URL編碼的,而第二個那個則是用UTF-8編碼的。如果我們在test.aspx中直接用Request.QueryString["string"]還取值,會發現第一個參數不能正常取值,而第二個參數則正常。這是因爲ASP.NET中在不指定編碼的時候,默認是使用UTF-8的編碼,自然進行URL反編碼的時候用的也是UTF-8編碼了。那麼,GB2312的URL編碼的內容,用UTF-8的URL反編碼,那肯定是會不正常的。
對於這問題,解決方法如下:
1、提交的參數是經過UTF-8 URL編碼的。
這種情況下,可以不作任何處理即可取到正常的值。例如我提交的是“test.aspx?string=%e9%a3%8e%e3%81%ae%e4%b8%96%e7%95%8c ”,那麼獲取的方法如下:
Dim stringValue As String
stringValue = Request.QueryString("string")
Response.Write(stringValue)
//Visual C#
string stringValue;
stringValue = Request.QueryString["string"];
Response.Write(stringValue);
2、提交的參數是經過GB2312 URL編碼的。
在這種情況下,就不能直接取值了。可以用下面的方法:
'引用System.Collections.Specialized和System.Text命名空間
Dim stringValue As String
Dim gb2312Requests As NameValueCollection
gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
Response.Write(gb2312Requests("string")) '裏面的string就是你提交的參數的Key
//Visual C#
'引用System.Collections.Specialized和System.Text命名空間
string stringValue;
NameValueCollection gb2312Requests;
gb2312Requests = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("GB2312"))
Response.Write(gb2312Requests["string"]); //'裏面的string就是你提交的參數的Key
有的時候,我們還想提交不同編碼的URL編碼字符串,可以接着往下看。
3、提交UTF8 URL編碼參數。
前面已經說過,在不指定編碼的時候,系統是自動使用UTF-8編碼的,那麼我們要提交UTF8 URL編碼參數可以直接使用Server.UrlEncode。代碼如下:
Dim strBefore As String = "風の世界"
Dim strAfter As String = ""
strAfter = Server.UrlEncode(strBefore)
Response.Write(strAlfter)
//Visual C#
string strBefore = "風の世界";
string strAlfter = "";
strAfter = Server.UrlEncode(strBefore);
Response.Write(strAlfter);
4、提交GB2312 URL編碼參數。
因爲系統默認使用的是UTF-8編碼,所以要用GB2312進行URL編碼。得指定一個編碼才行。代碼如下:
'引用System.Text命名空間
Dim strBefore As String = "風の世界"
Dim strAfter As String = ""
strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"))
Response.Write(strAlfter)
//Visual C#
//引用System.Text命名空間
string strBefore = "風の世界";
string strAlfter = "";
strAfter = HttpUtility.UrlEncode(strBefore, Encoding.GetEncoding("GB2312"));
Response.Write(strAlfter);
這樣,URL編碼後得到的就是GB2312的編碼字符了。
另外要注意的地方就是,ASP中Server.UrlEncode是以GB2312編碼進行URL編碼的。
轉載來自博客園。