2011-06-16 53 views
11

我希望它的輸出爲大寫。這是我得到Server.UrlEncode("http://")從Server.UrlEncode獲取字符串,大寫

http%3a%2f%2f 

,但我需要:

http%3A%2F%2F 

有沒有在C#中內置的解決方案?


url編碼將作爲簽名基礎字符串(輸入到簽名算法)來創建摘要(散列)。 哈希將被其他系統(java,php等)驗證,所以他們需要首先通過簽名重構來重新創建哈希。

+1

爲什麼一定要大寫? – 2011-06-16 11:31:33

+0

這個案例對於所有轉義字符都有影響嗎? – 2011-06-16 11:34:17

+7

對於類似於OAuth的情況,'%2f'和'%2F'之間的差異足以使您的簽名無效 - http://oauth.net/core/1.0/#encoding_parameters – 2013-07-06 00:00:32

回答

23

這將大寫字符串中的所有轉義字符。

string url = "http://whatever.com/something"; 
string lower = Server.UrlEncode(url); 
Regex reg = new Regex(@"%[a-f0-9]{2}"); 
string upper = reg.Replace(lower, m => m.Value.ToUpperInvariant()); 
+0

即代理-j沒有額外的「)」,謝謝! – lax 2011-06-16 12:45:35

+0

非常感謝。出於某種原因,Twitter的OAuth要求逃脫的字符大寫,否則會給你401未經授權的 – SAGExSDX 2013-06-12 20:54:49

+0

謝謝! (順便說一下,OAuth需要的原因是整個URL(「http://」和全部)都是URLEncoded,然後進行簽名。OAuth 1.0規範要求對於編碼字符使用大寫hexadicemal,但.net UrlEncode會產生小寫 - 差異導致簽名不匹配。) – 2013-07-06 00:04:06

0

假設「http」始終是前四個字符,那麼您只需在「http」之後分割字符串,即UrlEncode該部分,然後在其上調用ToUpper()即可。然後再加上「http」作爲前綴。

3

這是很容易

 
Regex.Replace(encodedString, @"%[a-f\d]{2}", m => m.Value.ToUpper()) 

即更換所有十六進制字母數字組合,以大寫

1
Uri.EscapeDataString("http://") 

此代碼返回

http%3A%2F%2F