可移植类库HttpUtility.UrlEncode

时间:2012-07-13 14:58:20

标签: windows-phone-7 microsoft-metro urlencode portable-class-library

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

2 个答案:

答案 0 :(得分:36)

使用Uri.EscapeUriStringUri.EscapeDataString

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

值得注意的是,这些方法都没有对包含-_.!~*'()的RFC 2396非保留字符进行编码 因此,如果您需要这些编码,那么您将不得不手动编码它们。

答案 1 :(得分:15)

WebUtility

在有幸成为.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());
}

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