.net UrlEncode – 小写问题
我正在为一个网关的数据传输工作,这需要我以UrlEncodedforms发送数据。 但是,.net的UrlEncode会创build小写的标签,并会中断传输(Java创build大写)。
任何想法如何强制.net来做大写的UrlEncoding?
UPDATE1:
.net出来:
dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2fENVuAlDQGRNCp1F
与Java的:
dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2FENVuAlDQGRNCp1F
(这是一个base64d 3DESstring,我需要维护它的情况下)。
我认为你被C#提供给你的东西卡住了,而获得错误则意味着另一端的UrlDecode函数执行得不好。
这就是说,你只需要遍历string和大写字母后面的符号。 这将保持你的base64数据不变,同时按照正确的格式编码的字符:
public static string UpperCaseUrlEncode(string s) { char[] temp = HttpUtility.UrlEncode(s).ToCharArray(); for (int i = 0; i < temp.Length - 2; i++) { if (temp[i] == '%') { temp[i + 1] = char.ToUpper(temp[i + 1]); temp[i + 2] = char.ToUpper(temp[i + 2]); } } return new string(temp); }
用正则expression式replaceHttpUtility.UrlEnocde中的小写百分号编码:
static string UrlEncodeUpperCase(string value) { value = HttpUtility.UrlEncode(value); return Regex.Replace(value, "(%[0-9a-f][0-9a-f])", c => c.Value.ToUpper()); } var value = "SomeWords 123 #=/ äöü"; var encodedValue = HttpUtility.UrlEncode(value); // SomeWords+123+%23%3d%2f+%c3%a4%c3%b6%c3%bc var encodedValueUpperCase = UrlEncodeUpperCase(value); // now the hex chars after % are uppercase: // SomeWords+123+%23%3D%2F+%C3%A4%C3%B6%C3%BC
我知道这是非常古老的,也许这个解决scheme不存在,但这是我在谷歌find的最重要的网页之一,试图解决这个问题。
System.Net.WebUtility.UrlEncode(posResult);
这编码为大写。
这很容易
Regex.Replace( encodedString, @"%[af\d]{2}", m => m.Value.ToUpper() )
即所有的hex字母数字组合replace为大写
如果有人在这里searchperl代码或PCRE(perl兼容的正则expression式)来解决这个问题,一个(尽可能短的候选人)perlexpression式将url编码转换为小写hex是:
s/%(\X{2})/%\L$1\E/go
和其他方式(小写字母到大写)
s/%(\x{2})/%\U$1\E/go
这是我在OAuth的Twitter应用程序中使用的代码…
Public Function OAuthUrlEncode(ByVal value As String) As String Dim result As New StringBuilder() Dim unreservedChars As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~" For Each symbol As Char In value If unreservedChars.IndexOf(symbol) <> -1 Then result.Append(symbol) Else result.Append("%"c + [String].Format("{0:X2}", AscW(symbol))) End If Next Return result.ToString() End Function
希望这可以帮助!
这是我公开的OAuth.OAuthBase
版本的UrlEncode
(.NET 2.0 / 3.5)的VB.NET转换:
' MEH: Made this ReadOnly because the range of unreserved characters is specified in the OAuth spec. Inheritors ought not change it. Protected Shared ReadOnly unreservedChars As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~" ' MEH: Added. These are the other characters HttpUtility.UrlEncode does not convert to percent encoding itself. Protected Shared ReadOnly reservedChars As String = " !'()*" ' If this moves to .NET 4+ ' can be removed. ''' <summary> ''' This is a different Url Encode implementation since the default .NET one outputs the percent encoding in lower case. ''' While this is not a problem with the percent encoding spec, it is used in upper case throughout OAuth. ''' Also the OAuth spec explicitly requires some characters to be unencoded. ''' </summary> ''' <param name="Value">The value to Url encode</param> ''' <returns>Returns a Url encoded string</returns> ''' <revisionhistory> ''' 140313 MEH Fixed to correctly cater for any characters between %80 and %ff, and the O(n^2) IndexOf call. ''' </revisionhistory> Public Shared Function UrlEncode(ByVal Value As String) As String Dim result, buffer As New StringBuilder() For Each symbol As Char In Value If unreservedChars.IndexOf(symbol) <> -1 Then UrlEncodeAppendClear(result, buffer).Append(symbol) ElseIf reservedChars.IndexOf(symbol) = -1 Then 'some symbols produce 2 or more octets in UTF8 so the system urlencoder must be used to get the correct data ' but this is best done over a full sequence of characters, so just store this one in a buffer. buffer.Append(symbol) Else ' These characters are not converted to percent encoding by UrlEncode. UrlEncodeAppendClear(result, buffer).AppendFormat(Globalization.CultureInfo.InvariantCulture, "%{0:X2}", AscW(symbol)) End If Next UrlEncodeAppendClear(result, buffer) Return result.ToString() End Function Private Shared percentHex As New RegularExpressions.Regex("(%[0-9a-f][0-9a-f])", RegularExpressions.RegexOptions.Compiled) ''' <summary> ''' Actually performs the UrlEncode on any buffered characters, ensuring the resulting percents are uppercased and clears the buffer. ''' </summary> ''' ''' <param name="Result">The result of the UrlEncode is appended here.</param> ''' <param name="Buffer">The current buffer of characters to be encoded. Cleared on return.</param> ''' ''' <returns>The <paramref name="Result">Result</paramref>, as passed in, with the UrlEncoding of the <paramref name="Buffer">buffer of characters</paramref> appended.</returns> ''' ''' <remarks>Would like to be an extension method.</remarks> ''' ''' <revisionhistory> ''' 140313 MEH Created. ''' </revisionhistory> Private Shared Function UrlEncodeAppendClear(ByVal Result As StringBuilder, ByVal Buffer As StringBuilder) As StringBuilder If Buffer.Length > 0 Then Result.Append(percentHex.Replace(HttpUtility.UrlEncode(Buffer.ToString), Function(c) c.Value.ToUpperInvariant())) Buffer.Length = 0 End If Return Result End Function