2015-05-04 66 views
0

我正在使用HttpUtility.UrlDecode(string)。但是,當我嘗試解碼字符串"%ab"時,它會返回「 」字符,從而產生問題。HttpUitlity.UrlDecode(string)是如何工作的?

+0

你有什麼期望的輸出? – usr

+1

爲什麼這是一個問題? '%ab'是'(char)171',它是「1/2」符號(根據http://www.asciitable.com/)。如果你得到「未知字符」的符號,那麼你使用的字體(字體)沒有那個符號......或者你的頁面編碼不正確。 – Dai

回答

1

如果你看看這個link你可以看到你可以發送編碼作爲參數的功能。我會玩這個,很可能,你從函數獲得的字符串編碼不是UTF-8。

1

https://msdn.microsoft.com/en-us/library/adwtk1fy(v=vs.110).aspx

已被編碼用於傳輸在URL爲解碼字符串轉換爲字符串。

URL編碼參考:http://www.w3schools.com/tags/ref_urlencode.asp

其最有可能你試圖解碼和UTF8 URL「%AB%犯規參考任何東西 - 這就是爲什麼你得到了‘’字符數限制。它不知道用什麼字符來解碼。

如果您嘗試這樣的事情解碼:「此%圖20是%20A%20text」則回覆:「這是一個文本」,因爲20%=「space'字符

0

您可以找到執行的方法on the reference source page,它實質上對指定的URL執行每個字符的驗證,並根據需要對其進行轉換。

您現在面臨的問題很可能與輸出字符串的編碼有關。由UrlDecode返回的字符可能會返回一個字符,該字符不會被顯示字符串的編碼支持,從而導致「怪異」字符。

爲了完整起見,這裏是整個方法:

internal string UrlDecode(string value, Encoding encoding) { 
     if (value == null) { 
      return null; 
     } 

     int count = value.Length; 
     UrlDecoder helper = new UrlDecoder(count, encoding); 

     // go through the string's chars collapsing %XX and %uXXXX and 
     // appending each char as char, with exception of %XX constructs 
     // that are appended as bytes 

     for (int pos = 0; pos < count; pos++) { 
      char ch = value[pos]; 

      if (ch == '+') { 
       ch = ' '; 
      } 
      else if (ch == '%' && pos < count - 2) { 
       if (value[pos + 1] == 'u' && pos < count - 5) { 
        int h1 = HttpEncoderUtility.HexToInt(value[pos + 2]); 
        int h2 = HttpEncoderUtility.HexToInt(value[pos + 3]); 
        int h3 = HttpEncoderUtility.HexToInt(value[pos + 4]); 
        int h4 = HttpEncoderUtility.HexToInt(value[pos + 5]); 

        if (h1 >= 0 && h2 >= 0 && h3 >= 0 && h4 >= 0) { // valid 4 hex chars 
         ch = (char)((h1 << 12) | (h2 << 8) | (h3 << 4) | h4); 
         pos += 5; 

         // only add as char 
         helper.AddChar(ch); 
         continue; 
        } 
       } 
       else { 
        int h1 = HttpEncoderUtility.HexToInt(value[pos + 1]); 
        int h2 = HttpEncoderUtility.HexToInt(value[pos + 2]); 

        if (h1 >= 0 && h2 >= 0) {  // valid 2 hex chars 
         byte b = (byte)((h1 << 4) | h2); 
         pos += 2; 

         // don't add as char 
         helper.AddByte(b); 
         continue; 
        } 
       } 
      } 

      if ((ch & 0xFF80) == 0) 
       helper.AddByte((byte)ch); // 7 bit have to go as bytes because of Unicode 
      else 
       helper.AddChar(ch); 
     } 

     return Utf16StringValidator.ValidateString(helper.GetString()); 
    }