最近要上個項目,其實很簡單的東西,就是拼接一個url,不過url中的參數(shù)需要UrlEncode編碼的,其實對我來說,這個問題很好解決,C#用HttpUtility.UrlEncode來進行編碼,asp用Server.UrlEncode來進行編碼。
問題解決了嗎?問題剛剛開始
因為這個公用轉(zhuǎn)向文件,是針對所有分站的,分站代碼有.net和asp兩種,文件編碼格式也不一樣。
頭大的事情開始了。asp站的文件編碼是gb2312,雖然.net的文件格式也是gb2312,但因為webconfig里設置的 requestEncoding是utf8的,所以在接收中文的時候,無論你UrlDeCode怎么解碼,哪怕你指定用gb2312解碼,出來的還是亂碼,那這時候你會說改下webconfig文件呀,不錯!如果是你自己的小項目,這樣的改動或許不算什么,可如果牽涉到很多項目,在你沒辦法改的情況下怎么辦呢????
先看看例子吧:
環(huán)境:
asp:文件名:test.asp 文件編碼:gb2312
.net:文件名:test.aspx,test.aspx.cs 文件編碼:gb2312
.net:文件名:go.aspx, go.aspx.cs文件編碼:gb2312
test.asp 代碼:
<%
str = Server.UrlEncode("中文測試")
Response.Redirect "go.aspx?name=" & str
%>
test.aspx.cs代碼:
string str = HttpUtility.UrlEncode("中文測試");
Response.Redirect("go.aspx?name=" + str);
go.aspx.cs代碼:
string name = HttpUtility.UrlDeCode(Request["name"], Encoding.GetEncoding("gb2312"));
Response.Redirect("http://www.xxx.com?name=
" + HttpUtility.UrlEncode(name));
其實在go.aspx.cs中,大家以為編碼定到gb2312,應該會正常了,其實錯了,我跟蹤了一下,在Request["name"]的時候,已經(jīng)解碼,解碼的是按照webconfig設置的,那就是utf8。
ok,.Net中,可以指定編碼進行url編碼,test.aspx.cs可以變成:HttpUtility.UrlEncode("中文測試", Encoding.GetEncoding("utf-8")) 這樣go.aspx接收后會完全轉(zhuǎn)換的。
可asp的Server.UrlEncode是沒有這個參數(shù)的,怎么辦呢?
2個辦法:
1、把test.asp保存為utf-8編碼
2、就是我自己想的一個不是辦法的辦法。
因為前面說了,我牽涉的項目都是無法更改編碼的,如果更改對網(wǎng)站的牽涉太大,所以只能另外想辦法。
在做了大量測試后,我發(fā)現(xiàn)UrlEncode轉(zhuǎn)碼后成為%AB%CD格式,大家都知道UrlEncode在轉(zhuǎn)碼英文的時候,會原封不動的還給你,比如你傳A,接收方接收的也是A,%會轉(zhuǎn)換成%25,UrlDecode解碼的時候%25無論你什么編碼,都會解碼成%
好,有思路了,假設“中文測試”編碼為%AB%CD%EF%GH
str = Server.UrlEncode("中文測試") '%AB%CD%EF%GH
str1 = Server.UrlEncode(Server.UrlEncode("中文測試")) '%25AB%25CD%25EF%25GH
我們再改下go.aspx.cs
Response.Write(HttpUtility.UrlDeCode(Request["str"],Encoding.GetEncoding("gb2312"));
Response.Write(HttpUtility.UrlDeCode(Request["str1"],Encoding.GetEncoding("gb2312"));
看下go.aspx頁面顯示:
第一條會顯示亂碼
第二條會顯示:中文測試
這是什么原因呢?因為在Request的時候,因為webconfig的關系,事先已經(jīng)按照utf8來進行解碼了,所以你再用指定格式解碼已經(jīng)無濟于事了。
第二個為什么可以呢?因為我2次編碼了,所以Request的時候,會事先解碼成:%AB%CD%EF%GH
所以我在用UrlDecode來進行解碼,OK!任務完成