HttpUtility.UrlEncode,Request.RawUrl,HttpUtility.UrlDecode,HttpUtility.UrlPathEncode,Uri.EscapeDataS

碰到一樣問題, 記錄一下. 引自:https://www.cnblogs.com/ken-admin/p/5826480.html HttpUtility.UrlDecode(url),從Encode到Decode,「C++」變成了「C 」(加號變成空格)(紅色+藍色+白色=>紅色 藍色 白色)。這是你們熟知的問題,這裏咱們分析一下這個問題,並給出解決方法。 先看一下問題發生的過程: 1. 原始連接: http://www.cnblogs.com/xd502djj/tag/C++/ 2. HttpUtility.UrlEncode以後,獲得: http://www.cnblogs.com/xd502djj/tag/C%2b%2b/ 3. Request.RawUrl,獲得: http://www.cnblogs.com/xd502djj/tag/C++/ 4. HttpUtility.UrlDecode,獲得: http://www.cnblogs.com/xd502djj/tag/C / 上面第3步已經獲得正確的結果,第4步的UrlDecode反而將加號變爲了空格。 看來解決方法很簡單,取消畫蛇添足的UrlDecode,開始咱們也是這麼幹的。過了一段時間,有用戶反映「Windows Phone」的標籤失效了,變成了「Windows+Phone」。咱們一查,原來是在HttpUtility.UrlEncode時,空格被轉換爲加號,須要調用UrlDecode將加號還原爲空格,因而又把HttpUtility.UrlDecode加上(忘了以前的「C++」標籤問題)。而後,「C++」標籤又失效...這樣反反覆覆,看似Bug不少,工做很忙,實際上就是一個Bug... 終於有一天,咱們說「不再能這樣過」,開始尋找解決方案: 既然HttpUtility.UrlEncode()不能用,那在.NET中找找有沒有替代品。 先找到了HttpUtility.UrlPathEncode()。嘿,有用,輕鬆搞定「C++」與空格問題,可是...後來發現搞不定「C#」,它沒有對「#」進行編碼。 繼續尋找...找到了Uri.EscapeUriString(),與HttpUtility.UrlPathEncode()一樣的問題。 繼續尋找...終於找到了...Uri.EscapeDataString(),搞定!請看下面的測試代碼: public void UrlEncodeTest() { string url = "C++ C#"; Console.WriteLine(HttpUtility.UrlEncode(url));//C%2b%2b+C%23 Console.WriteLine(HttpUtility.UrlPathEncode(url));//C++%20C# Console.WriteLine(Uri.EscapeUriString(url));//C++%20C# Console.WriteLine(Uri.EscapeDataString(url));//C%2B%2B%20C%23 }
相關文章
相關標籤/搜索