解UrlPathEncode的字串的噩夢

2022-02-17 07:36:55 字數 2385 閱讀 4953

解urlpathencode的字串的噩夢

我個人比較喜歡用gb2312做**,web.config中一直都是使用:

xml version="1.0" encoding="gb2312" 

?>

<

globalization 

requestencoding

="gb2312"

responseencoding

="gb2312"

/>

然後,噩夢便開始了……

做乙個最簡單的頁面:

<

%response.

write

(server.urldecode(server.urlpathencode("兩性

")) &"

")response.

write

(httputility.urldecode(server.urlpathencode("兩性

"), encoding.utf8) &"

")%>

因為做了全域性設定為gb2312,所以

server.urldecode(string)

實際上是等價於

但是,該死的server.urlpathencode(string)永遠是將傳入的字串按照utf-8去編碼,「兩性」對應的編碼為:

%e4%b8%a4%e6%80%a7

試試google的解碼:

google的解碼是完全正確的。

但是,在頁面編碼為gb2312的情況下:

server.urldecode(server.urlpathencode("兩性"

))出來之後是亂碼,因為server.urldecode出來的是乙個utf-8編碼的字串,手動ie編碼為utf-8時,是可以看到「兩懷」的。

但是,如果是「兩性人」的話,則可以正確顯示。

嘗試過n種字串,在大部分情況下,偶數個中文都可以正確顯示,比方說「資料」,奇數個中文則最後乙個字會被砍掉,比方說,「資料庫」會變成「資料」。

我前面用「兩性」做例子,是因為「兩性」是偶數個中文,但是無法正確顯示,而相應的「兩性人」是奇數個中文,但卻可以正常顯示。(「人兩性」,「性兩人」等等也都是會出錯。)

編碼是正確的,只是,解碼有時會出錯。

我浪費了無數的時間,企圖將這個utf-8的字串轉換為gb2312的格式;都是徒勞的。

我得出來的結果是,urldecode這個函式有bug,而且,這個bug似乎很有普遍性。

asp並沒有提供urldecode的系統函式,我所找到的兩個版本的asp urldecode函式似乎也都存在類似的問題。

誇張的是看看下面的帖子:

在jsp中:http://localhost:8700/acweb/executereport.do?filename=/批處理摸版本/三引數設定.vtf;1

string filename=request.getparameter("filename");

filename= new string(filename.getbytes("iso8859-1"), "utf-8");

結果顯示filename為:/批處理摸版本/三引數設,  丟失:置.vtf;1

將「/批處理摸版本/三引數設定.vtf;1」在asp.net中使用server.urlpathencode之後再server.urldecode,出現了跟jsp一樣的錯誤解碼!

據說:「ms

之前犯的著名

url解碼錯誤」

但是,為什麼同樣的錯誤sun也犯?

well,在asp.net中,不要使用server.urldecode,使用httputility.urldecode並使用相應的encoding引數便可以解決問題。

不過,要正確獲得:http://localhost/try.aspx?s=%e4%b8%a4%e6%80%a7

還是要浪費一下時間,使用

request.querystring(0)

獲得的字串「%e4%b8%a4%e6%80%a7」已經被自動錯誤解碼為utf-8的「兩懷」了。

我使用的是類似:

tw = mid(request.rawurl, 15, request.rawurl.length - 13)

的方法來直接獲得「%e4%b8%a4%e6%80%a7」,然後再使用httputility.urldecode將其解碼。

呼呼……在google的時候,幾乎沒有google出來比較詳盡的說明這個解碼錯誤的問題的東西,而且,遇到這樣問題的程式設計師大多數都是在做jsp或者是wap開發的……敢情,做asp.net的,都沒有遇到過這樣的問題麼?

問天 @2005-5-10 8:09:47

硬解和軟解的區別

q 什麼是硬解?a 硬解是要機器中的專門的解碼晶元來完成,質量因廠家的技術能力而定,部分廠商技術實力強,相容性和解碼效果做的比較好,而有些廠商技術實力稍差,相容性和解碼效果做的就不盡如意。q 什麼是軟解?a 軟解就是用cpu來解碼,需要cpu的效能與處理能力較強,但對流 格式相容性比較好,因為軟解庫...

解析解與數值解的區別

科學網 這段時間一直在聽數學學院的課,反反覆覆聽到 解析解 和 數值解 始終不明白這兩者的區別。經學長解釋,總算有點眉目 解析解就是給出解的具體函式形式,從解的表示式中就可以算出任何對應值 數值解就是用數值方法求出解,給出一系列對應的自變數和解。e.g.eq x 2 5 solution x sqr...

閉式解 解析解

閉式解也被稱為解析解,是通過嚴格的公式所求得的解,即包含分式 三角函式 指數 對數甚至無限級數等基本函式的解的形式。通過給出解的具體函式形式,從解的表示式中就可以算出任何對應值。解析解,又稱為閉式解,是可以用解析表示式來表達的解。在數學上,如果乙個方程或者方程組存在的某些解,是由有限次常見運算的組合...