我正在为网关进行数据传输,这需要我以UrlEncoded格式发送数据。但是,.net的UrlEncode会创建小写标签,并且会中断传输(Java会创建大写)。
有什么想法我怎么强迫.net做大写的UrlEncoding?
UPDATE1:
.net out:
dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2fENVuAlDQGRNCp1F
vs Java's:
dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2FENVuAlDQGRNCp1F
(它是一个base64d 3DES字符串,我需要保持它的情况)。
答案 0 :(得分:44)
我认为你坚持使用C#给你的东西,并且得到错误表明在另一端实现了糟糕的UrlDecode功能。
话虽如此,你应该只需要遍历字符串并仅使用%符号后面的两个字符进行大写。这将保持您的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);
}
答案 1 :(得分:18)
我知道这已经很老了,也许这个解决方案并不存在,但这是我在谷歌尝试解决这个问题时发现的首页之一。
System.Net.WebUtility.UrlEncode(posResult);
这编码为大写。
答案 2 :(得分:15)
将HttpUtility.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
答案 3 :(得分:3)
这很容易
Regex.Replace( encodedString, @"%[a-f\d]{2}", m => m.Value.ToUpper() )
即。将所有十六进制字母数字组合替换为大写
答案 4 :(得分:2)
如果有其他人来搜索perl代码或PCRE(perl兼容的正则表达式)来解决问题,那么将url编码转换为小写十六进制的(最短的候选者)perl-expression是:< / p>
s/%(\X{2})/%\L$1\E/go
反过来(小写到大写)
s/%(\x{2})/%\U$1\E/go
答案 5 :(得分:0)
这是我在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
希望这有帮助!
答案 6 :(得分:0)
这是我对UrlEncode
' 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
版本(对于.NET 2.0 / 3.5)的VB.NET转换:
{{1}}