.net UrlEncode - 小写问题

bal*_*int 27 .net urlencode

我正在为网关进行数据传输,这需要我以UrlEncoded格式发送数据.但是,.net的UrlEncode创建了小写标签,它打破了传输(Java创建大写).

有什么想法我怎么强迫.net做大写的UrlEncoding?

UPDATE1:

.net出:

dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2fENVuAlDQGRNCp1F
Run Code Online (Sandbox Code Playgroud)

vs Java:

dltz7UK2pzzdCWJ6QOvWXyvnIJwihPdmAioZ%2FENVuAlDQGRNCp1F
Run Code Online (Sandbox Code Playgroud)

(这是一个base64d 3DES字符串,我需要保持它的情况).

Kev*_*vin 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 即使规范说任何一个都没问题,当编码的字符串是Hashing例程的输入的一部分时,它仍然会产生巨大的差异:-( (15认同)
  • 这与我有关,因为我使用的是HMAC.花了整整两个小时才发现微妙的差异导致我失败了. (3认同)
  • 我遇到了与@frostymarvelous类似的问题,我需要生成查询字符串其余部分的HMAC签名,而URI不区分大小写,HMAC就是.根据RFC 3986,大写和小写十六进制代码在"百分比编码"中都是合法的(意味着服务器和浏览器应该接受),但建议使用大写以保持一致性. (3认同)
  • @balint,相关的RFC说你可以在URL中使用大写或小写的转义字符,这就是为什么小写错误表明解码端的错误实现.但是,上面的C#代码将产生与Java的UrlEncode相同的结果,所以除非我误解了这个问题,否则它应该是你需要的. (2认同)

Gre*_*rus 22

我知道这是非常古老的,也许这个解决方案不存在,但这是我在谷歌尝试解决这个问题时发现的首页之一.

System.Net.WebUtility.UrlEncode(posResult);
Run Code Online (Sandbox Code Playgroud)

这编码为大写.


Mar*_*ger 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
Run Code Online (Sandbox Code Playgroud)