我正在尝试比较两个字符串,但其中一个字符串末尾包含一个空格。我使用了 Trim() 并进行了比较但没有工作,因为那个空白被转换为 %20 并且我认为 Trim 不会删除它。它类似于"abc"
and "abc%20"
,在这种情况下我能做些什么来比较字符串而忽略大小写?
7 回答
%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
使用 HttpUtility.UrlDecode 解码字符串:
string s1 = "abc ";
string s2 = "abc%20";
if (System.Web.HttpUtility.UrlDecode(s1).Equals(System.Web.HttpUtility.UrlDecode(s2)))
{
//equals...
}
对于 WinForms 或控制台(或任何非 ASP.NET)项目,您必须在System.Web
项目中添加对程序集的引用。
"%20"
是' '
(空格)字符的url 编码版本。您是否在比较编码的 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
可能是字符串之间不区分大小写比较的最快方法。
就像是:
if (System.Uri.UnescapeDataString("abc%20").ToLower() == myString.ToLower()) {}
你试过这个吗?
string before = "abc%20";
string after = before.Replace("%20", "").ToLower();
您可以使用String.Replace
and ,因为您提到了不区分大小写String.ToLower
,如下所示:
var str1 = "abc";
var str2 = "Abc%20";
str1.Replace("%20", "").ToLower() == str2.Replace("%20", "").ToLower();
// will be true
似乎根本问题出在对 URL 进行编码时。如果您将使用字符编码,那么您将永远不会得到 %20。HttpUtility.UrlEncode utf-8 使用的默认编码。这是用法
System.Web.HttpUtility.UrlEncode("ãName Marcos", System.Text.Encoding.GetEncoding("iso-8859-1"))
在这里,您可以在 Microsoft 网站上阅读有关字符编码的更多信息。如果你会做正确的编码,你可以避免剩下的工作
这就是你问的 -
第二种情况 - 如果您必须根据需要比较两个字符串,则需要解码 HttpUtility.UrlDecode(test)
bool result = HttpUtility.UrlDecode(stringOne).Equals(HttpUtility.UrlDecode(stringOne));
结果 bool 知道它们是相等还是不相等
Console.WriteLine("Result is", result ? "equal." : "not equal.");
希望能帮助到你