【问题标题】:Portable Class Library HttpUtility.UrlEncode可移植类库 HttpUtility.UrlEncode
【发布时间】:2012-07-13 10:54:26
【问题描述】:

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

【问题讨论】:

  • WP7 支持 HttpUtility.UrlEncode。
  • 当我在 PCL 中选择 Metro 和 WP7.1 时不支持。
  • 它们生活在不同的位置和二进制文件中,因此,为什么它们不可用。

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


【解决方案1】:

使用Uri.EscapeUriStringUri.EscapeDataString

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

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

【讨论】:

  • 您使用这两种方法还是其中一种?两者的文档是相同的,只是方法名称不同。
  • 我编辑了上面的答案来解释这些方法之间的差异。
【解决方案2】:

网络实用程序

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多