可移植类库HttpUtility.UrlEncode

Muh*_*eed 28 urlencode windows-phone-7 portable-class-library microsoft-metro

我知道在可移植类库中很好地支持Web请求.在PCL中是否有任何HttpUtility.UrlEncode等效?我需要它用于Windows Phone和Metro应用程序.

Jon*_*Jon 36

使用Uri.EscapeUriStringUri.EscapeDataString

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

重要的是要注意,这些方法都不编码包含RFC 2396的非保留字符.-_.!~*'() 因此,如果您需要这些编码,则必须手动编码它们.


pat*_*dge 15

WebUtility

在便携式类库中幸运地以.NET 4.5为目标(例如Profile7),许多HttpUtility方法都有兄弟姐妹System.Net.WebUtility.

using System.Net;

WebUtility.UrlEncode("some?string#");
Run Code Online (Sandbox Code Playgroud)

潜在的警告

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

WebUtility.UrlEncode("?") // -> "%3F"
HttpUtility.UrlEncode("?") // -> "%3f"
Run Code Online (Sandbox Code Playgroud)

使其向后兼容

如果您依赖于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());
}
Run Code Online (Sandbox Code Playgroud)

(即使这是一个简单的,总是正则表达式,风险自负.)