2012-10-15 351 views
7

如何解碼像下面的字符串:解碼百分比編碼串#.NET

NAME1 = ABC &用戶id = DEF & NAME2 = ZYX &有效載荷=%3cSTAT +的xmlns%3axsi%3D%22http% 3A%2F%2fwww.w3.org%2f2001%2fXMLSchema實例%22%3E%3cREQ ...

背景:我接受的HTTP POST(名稱值對,基本上),那麼字節數組轉換爲字符串與:

Encoding.UTF8.GetString(response, 0, response.Length); 

我試過HtmlD WebUtility和HttpUtility的ecode方法,但似乎得到相同的字符串回來。

回答

17

這應該爲你做的工作:

System.Uri.UnescapeDataString(str) 
+0

感謝所有。這兩個答案讓我需要去的地方! Uri方法和HttpUtility方法有什麼優點/缺點? –

+0

如果你不需要它,Uri將允許你從你的引用中排除System.Web。 –

+1

@JohnSpiegel:是的,存在細微差別,請參閱我編輯的答案。 –

8

你試過HttpUtility.UrlDecode

請參閱here

請注意,此功能與HttpUtility.HtmlDecode不完全相同。

編輯:在回答關於UrlDecodeUnescapeDataString之間的差異問題:

引述MSDN pageUnescapeDataString

許多Web瀏覽器逃生空間URI的內部劃分爲加號( 「+」)字符;但是,UnescapeDataString方法不會將加號字符轉換爲空格,因爲此行爲在所有URI方案中都不是標準的。

UrlDecode確實,雖然處理這些,你會得到不同的反應,如果你嘗試以下方法:

string a = Uri.UnescapeDataString(".Net+Framework"); //returns ".Net+Framework" 
string b = HttpUtility.UrlDecode(".Net+Framework"); //returns ".Net Framework" 

因此它似乎是,爲更好的覆蓋,HttpUtility.UrlDecode是更好的選擇。

2
var result = System.Web.HttpUtility.UrlDecode("name1=ABC&userId=DEF&name2=zyx&payload=%3cSTAT+xmlns%3axsi%3d%22http%3a%2f%2fwww.w3.org%2f2001%2fXMLSchema-instance%22%3e%3cREQ..."); 

name1=ABC&userId=DEF&name2=zyx&payload=<STAT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><REQ... 

,我希望這是你想要的。