我理解在可移植类库中很好地支持Web请求。在PCL中是否有任何HttpUtility.UrlEncode等效?我需要它用于Windows Phone和Metro应用程序。
答案 0 :(得分:36)
使用Uri.EscapeUriString
和Uri.EscapeDataString
两者之间的唯一区别是EscapeDataString
还对RFC 2396保留字符进行编码,其中包含这些字符;/?:@&=+$
,
值得注意的是,这些方法都没有对包含-_.!~*'()
的RFC 2396非保留字符进行编码
因此,如果您需要这些编码,那么您将不得不手动编码它们。
答案 1 :(得分: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());
}
(即使这是一个简单的,总是正则表达,风险自负。)