我正在尝试比较两个字符串,但其中一个字符串在末尾包含一个空格。我使用了Trim()并进行了比较,但是没有工作,因为白色空间正在转换为%20,而我的东西Trim并没有删除它。它类似于"abc"
和"abc%20"
,在这种情况下我可以做些什么来比较字符串而忽略这种情况呢?
答案 0 :(得分:5)
%20
是url编码的空间版本。
您无法使用Trim()
直接删除它,但您可以使用HttpUtility.UrlDecode()将%20
解码回某个空格,然后完全修剪/进行比较否则;
using System.Web;
//...
var test1 = "HELLO%20";
var test2 = "hello";
Console.WriteLine(HttpUtility.UrlDecode(test1).Trim().
Equals(HttpUtility.UrlDecode(test2).Trim(),
StringComparison.InvariantCultureIgnoreCase));
> true
答案 1 :(得分:4)
使用HttpUtility.UrlDecode解码字符串:
string s1 = "abc ";
string s2 = "abc%20";
if (System.Web.HttpUtility.UrlDecode(s1).Equals(System.Web.HttpUtility.UrlDecode(s2)))
{
//equals...
}
如果是WinForms或Console(或任何非ASP.NET)项目,则必须在项目中添加对System.Web
程序集的引用。
答案 2 :(得分:1)
"%20"
是' '
(空格)字符的网址编码版本。您是否在比较编码的URL参数?如果是这样,您可以使用:
string str = "abc%20";
string decoded = HttpUtility.UrlDecode(str); // decoded becomes "abc "
如果需要修剪任何空格,则应对已解码的字符串执行此操作。 Trim
方法无法理解或识别已编码的空白字符。
decoded = decoded.Trim();
现在,您可以使用以下内容与decoded
变量进行比较:
decoded.Equals(otherValue, StringComparison.OrdinalIgnoreCase);
StringComparison.OrdinalIgnoreCase
可能是字符串之间不区分大小写比较的最快方法。
答案 3 :(得分:1)
类似的东西:
if (System.Uri.UnescapeDataString("abc%20").ToLower() == myString.ToLower()) {}
答案 4 :(得分:0)
你试过这个吗?
string before = "abc%20";
string after = before.Replace("%20", "").ToLower();
答案 5 :(得分:0)
您可以使用String.Replace
,因为您提到了不区分大小写String.ToLower
,如下所示:
var str1 = "abc";
var str2 = "Abc%20";
str1.Replace("%20", "").ToLower() == str2.Replace("%20", "").ToLower();
// will be true
答案 6 :(得分:0)
似乎根本问题在于您使用编码Url时。如果你将使用字符编码,那么你永远不会得到%20。 HttpUtility.UrlEncode utf-8使用的默认编码。这是用法
System.Web.HttpUtility.UrlEncode("ãName Marcos", System.Text.Encoding.GetEncoding("iso-8859-1"))
和Here, on Microsoft website您可以阅读有关字符编码的更多信息。 如果你能做适当的编码,你可以避免其余的工作
这就是你问的问题 -
第二种情况 - 如果你需要根据需要比较两个字符串,你需要解码HttpUtility.UrlDecode(测试)
bool result = HttpUtility.UrlDecode(stringOne).Equals(HttpUtility.UrlDecode(stringOne));
结果bool知道他们是平等还是不平等
Console.WriteLine("Result is", result ? "equal." : "not equal.");
希望有所帮助