.net UrlEncode – problema minúsculo

Estoy trabajando en una transferencia de datos para una puerta de enlace que requiere que envíe datos en formato UrlEncoded. Sin embargo, UrlEncode de .net crea tags en minúsculas y rompe la transferencia (Java crea mayúsculas).

¿Alguna idea de cómo puedo forzar .net para hacer mayúsculas UrlEncoding?

actualización1:

.net out:

dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2fENVuAlDQGRNCp1F 

vs Java:

 dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2FENVuAlDQGRNCp1F 

(es una cadena 3DES base64d, necesito mantener su caso).

Creo que estás atascado con lo que C # te da, y obtener errores sugiere una función de UrlDecode mal implementada en el otro extremo.

Dicho esto, solo deberías recorrer la cadena y en mayúsculas solo los dos caracteres siguiendo un signo de%. Esto mantendrá intactos los datos de tu base64 al dar masajes a los caracteres codificados en el formato correcto:

 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); } 

Reemplace la encoding de porcentaje en minúsculas de HttpUtility.UrlEnocde con una Regex:

 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 

Sé que esto es muy antiguo y tal vez esta solución no existía, pero esta fue una de las mejores páginas que encontré en google cuando trato de resolver esto.

 System.Net.WebUtility.UrlEncode(posResult); 

Esto codifica a mayúsculas.

Esto es muy facil


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

Es decir, reemplaza todas las combinaciones de letras y cifras hexadecimales por mayúsculas

si alguien más llega aquí en busca de un código perl o una PCRE (expresión regular compatible con perl) para resolver el problema, una expresión perl (candidata para la más corta posible) para convertir la encoding url a hexadecimal en minúscula es:

 s/%(\X{2})/%\L$1\E/go 

y al revés (minúsculas a mayúsculas)

 s/%(\x{2})/%\U$1\E/go 

Este es el código que estoy usando en una aplicación de Twitter para OAuth …

  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 

¡Espero que esto ayude!

Aquí está mi conversión de VB.NET de la versión pública OAuth.OAuthBase de UrlEncode (para .NET 2.0 / 3.5):

 ' 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. '''  ''' 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. '''  ''' The value to Url encode ''' Returns a Url encoded string '''  ''' 140313 MEH Fixed to correctly cater for any characters between %80 and %ff, and the O(n^2) IndexOf call. '''  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) '''  ''' Actually performs the UrlEncode on any buffered characters, ensuring the resulting percents are uppercased and clears the buffer. '''  ''' ''' The result of the UrlEncode is appended here. ''' The current buffer of characters to be encoded. Cleared on return. ''' ''' The Result, as passed in, with the UrlEncoding of the buffer of characters appended. ''' ''' Would like to be an extension method. ''' '''  ''' 140313 MEH Created. '''  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