28

我知道可移植类库很好地支持发出 Web 请求。PCL 中是否有 HttpUtility.UrlEncode 的等价物?我需要它用于 Windows Phone 和 Metro 应用程序。

4

2 回答 2

36

使用Uri.EscapeUriStringUri.EscapeDataString

两者之间的唯一区别是EscapeDataString它还对包含这些字符的 RFC 2396 保留字符进行编码;/?:@&=+$

重要的是要注意,这些方法都没有对 RFC 2396 未保留字符进行编码,-_.!~*'() 因此如果您需要这些编码,则必须手动对它们进行编码。

于 2012-07-13T17:02:22.517 回答
15

网络实用程序

在有幸以 .NET 4.5(例如 Profile7)为目标的可移植类库中,许多 HttpUtility 方法在System.Net.WebUtility.

using System.Net;

WebUtility.UrlEncode("some?string#");

潜在警告

虽然一些同级方法看起来与它们的 HttpUtility 对应方法相同,但这个方法在生成的编码之间略有不同。WebUtility.UrlEncode生成大写编码,同时HttpUtility.UrlEncode生成小写编码。

WebUtility.UrlEncode("?") // -> "%3F"
HttpUtility.UrlEncode("?") // -> "%3f"

使其向后兼容

如果您依赖您的 PCL 代码生成与之前的 HttpUtility 代码完全相同的内容,您可以围绕此方法创建自己的辅助方法并对其进行正则表达式。

using System.Text.RegularExpressions;

public static string UrlEncodeOldSchool(string value) {
    var encodedValue = WebUtility.UrlEncode(value);
    return Regex.Replace(encodedValue, "(%[0-9A-F]{2})",
                         encodedChar => encodedChar.Value.ToLowerInvariant());
}

(尽管这是一个简单的,但始终需要您自担正则表达式的风险。)

于 2015-03-10T21:30:58.900 回答