通常我只会使用:
HttpContext.Current.Server.UrlEncode("url");
但由于这是一个控制台应用程序,HttpContext.Current
所以总是null
.
还有另一种方法可以做同样的事情吗?
试试这个!
Uri.EscapeUriString(url);
或者
Uri.EscapeDataString(data)
无需引用 System.Web。
编辑:有关更多信息,请参阅另一个SO 答案...
我不是 .NET 人,但是,你不能使用:
HttpUtility.UrlEncode Method (String)
此处描述:
来自 Ian Hopkins 的代码无需添加对 System.Web 的引用即可为我解决问题。对于不使用 VB.NET 的人来说,这里是 C# 的一个端口:
/// <summary>
/// URL encoding class. Note: use at your own risk.
/// Written by: Ian Hopkins (http://www.lucidhelix.com)
/// Date: 2008-Dec-23
/// (Ported to C# by t3rse (http://www.t3rse.com))
/// </summary>
public class UrlHelper
{
public static string Encode(string str) {
var charClass = String.Format("0-9a-zA-Z{0}", Regex.Escape("-_.!~*'()"));
return Regex.Replace(str,
String.Format("[^{0}]", charClass),
new MatchEvaluator(EncodeEvaluator));
}
public static string EncodeEvaluator(Match match)
{
return (match.Value == " ")?"+" : String.Format("%{0:X2}", Convert.ToInt32(match.Value[0]));
}
public static string DecodeEvaluator(Match match) {
return Convert.ToChar(int.Parse(match.Value.Substring(1), System.Globalization.NumberStyles.HexNumber)).ToString();
}
public static string Decode(string str)
{
return Regex.Replace(str.Replace('+', ' '), "%[0-9a-zA-Z][0-9a-zA-Z]", new MatchEvaluator(DecodeEvaluator));
}
}
你会想要使用
System.Web.HttpUtility.urlencode("url")
确保将 system.web 作为项目中的引用之一。我不认为它默认包含在控制台应用程序中作为参考。
WebUtility.UrlEncode(string)
从System.Net
命名空间使用
尝试在 HttpUtility 类中使用 UrlEncode 方法。
我自己遇到了这个问题,我没有将 System.Web 程序集添加到我的项目中,而是编写了一个用于编码/解码 URL 的类(它非常简单,我已经做了一些测试,但不是很多)。我在下面包含了源代码。请:如果你重用这个,请在顶部留下评论,如果它坏了不要怪我,从代码中学习。
''' <summary>
''' URL encoding class. Note: use at your own risk.
''' Written by: Ian Hopkins (http://www.lucidhelix.com)
''' Date: 2008-Dec-23
''' </summary>
Public Class UrlHelper
Public Shared Function Encode(ByVal str As String) As String
Dim charClass = String.Format("0-9a-zA-Z{0}", Regex.Escape("-_.!~*'()"))
Dim pattern = String.Format("[^{0}]", charClass)
Dim evaluator As New MatchEvaluator(AddressOf EncodeEvaluator)
' replace the encoded characters
Return Regex.Replace(str, pattern, evaluator)
End Function
Private Shared Function EncodeEvaluator(ByVal match As Match) As String
' Replace the " "s with "+"s
If (match.Value = " ") Then
Return "+"
End If
Return String.Format("%{0:X2}", Convert.ToInt32(match.Value.Chars(0)))
End Function
Public Shared Function Decode(ByVal str As String) As String
Dim evaluator As New MatchEvaluator(AddressOf DecodeEvaluator)
' Replace the "+"s with " "s
str = str.Replace("+"c, " "c)
' Replace the encoded characters
Return Regex.Replace(str, "%[0-9a-zA-Z][0-9a-zA-Z]", evaluator)
End Function
Private Shared Function DecodeEvaluator(ByVal match As Match) As String
Return "" + Convert.ToChar(Integer.Parse(match.Value.Substring(1), System.Globalization.NumberStyles.HexNumber))
End Function
End Class
Kibbee 提供了真正的答案。是的,HttpUtility.UrlEncode 是正确的使用方法,但默认情况下它不适用于控制台应用程序。您必须添加对 System.Web 的引用。要做到这一点,
现在您可以使用 UrlEncode 方法。你还想补充,
使用 System.Web
在控制台应用程序的顶部或在调用方法时使用完整的命名空间,
System.Web.HttpUtility.UrlEncode(someString)
System.Web 中的 HttpUtility.UrlEncode("url")。
使用静态 HttpUtility.UrlEncode 方法。
最好的办法是添加对 System.web..dll 的引用
并使用 var EncodedUrl=System.Web.HttpUtility.UrlEncode("URL_TEXT");
您可以在System.web.dll中找到该文件
Uri.EscapeUriString 不应用于转义要在 URL 中传递的字符串,因为它不会像您预期的那样对所有字符进行编码。'+' 是一个很好的例子,它没有被转义。然后将其转换为 URL 中的空格,因为这就是简单 URI 中的含义。显然,当您尝试在 URL 中传递诸如 base 64 编码字符串之类的内容时,这会导致大量问题,并且空格会出现在接收端的整个字符串中。
您可以使用 HttpUtility.UrlEncode 并将所需的引用添加到您的项目中(如果您正在与 Web 应用程序通信,那么我认为您没有理由不这样做)。
或者在 Uri.EscapeUriString 上使用 Uri.EscapeDataString ,这里解释得很好:https ://stackoverflow.com/a/34189188/7391