先看下面兩個url,他們傳遞的引數一樣麼??
aaa.aspx?tag=.net%bc%bc%ca%f5
aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
看起來好像是不一樣,其實他們都是對".net技術"進行了urlencode,不過乙個是gb2312的編碼,乙個是utf-8的編碼。
如下**就可以獲得上面的編碼後效果:
string tmp1 = system.web.httputility.urlencode(".net技術", system.text.encoding.getencoding("gb2312"));
string tmp2 = system.web.httputility.urlencode(".net技術", system.text.encoding.utf8);
我們實際的web頁面,可能會被其他程式呼叫。
比如:簡體中文作業系統上的乙個asp頁面,需要向乙個asp.net頁面傳遞乙個帶中文的引數。
預設情況下,簡體中文作業系統上, asp 的 server.urlencode 方法會把中文以gb2312的編碼進行編碼,
但是預設情況下,asp.net的頁面是採用的utf-8編碼。
這種情況下,你在用 request.querystring["tag"] 接受值的時候會接受不到中文資訊,單步除錯看到的是亂碼。
這時候雖然用request.querystring["tag"] 接受的是亂碼,但這時候的url並不是亂碼。
解決方法就是自己分析url中的引數,然後對引數的值按照 gb2312的編碼反解密,而不是用.net 預設的utf-8的編碼反解密。
其實微軟類似的提供了相應的函式,我們不必自己用正規表示式去分析url字串了。
演示**如下:
我們用 lutz roeder's .net reflector 來看 system.web.httputility.parsequerystring 方法的實現:
一直反查進去,我們可以看到最終處理url引數字串分析的**如下:
system.web.httpvaluecollection 類的如下函式實現了對url引數的解析
這裡我們看到,它是自己乙個個字元進行的分析。
internal void fillfromstring(string s, bool urlencoded, encoding encoding)
break;
}num2++;
}string text1 = null;
string text2 = null;
if (num4 >= 0)
else
if (urlencoded)
else
if ((num2 == (num1 - 1)) && (s[num2] == '&'))}}
至於對方傳遞給自己的是哪種編碼方式,最好也一併作為引數傳遞過來,這樣我們就可以根據使用者的這個引數進行解密操作。
解密不同編碼的的引數
先看下面兩個url,他們傳遞的引數一樣麼?aaa.aspx?tag net bc bc ca f5 aaa.aspx?tag net e6 8a 80 e6 9c af 看起來好像是不一樣,其實他們都是對 net技術 進行了urlencode,不過乙個是gb2312的編碼,乙個是utf 8的編碼。如...
留心文字編碼的不同
ruby基礎教程 的第二十二章,有這樣一段示例 意圖刪除讀取的html檔案的頭部和尾部,並儲存在新的txt檔案中。1 htmlfile cathedral.html 2 textfile cathedral.txt 3 4 html file.read htmlfile 5 6 file.open ...
不同字元編碼型別的總結
計算機一開始在美國使用,字元編碼也只包括英文本母。anscii編碼由乙個位元組表示所有符號。乙個位元組可以表示的所有可能是256 2的8次方 種,對於美國人來說,26個英文本母,加上常用的符號,也只是用了127個。如果大家都用英文,那這套編碼完全夠用。但是不同國家的文字不同,如果加上其他國家的語言符...