虽然@sa_ddam213 的回答肯定解决了这个问题,但它可能有助于准确理解这个特定字符串的情况。
如果您尝试使用其他“特殊字符”的示例,则不会出现问题。例如,以下字符串按预期工作:
string url1 = @"http://it.wikipedia.org/wiki/»Abd_Allāh_al-Sallāl";
Console.WriteLine(url1.LastIndexOf("it.wikipedia.org/wiki/")); // 7
string url2 = @"http://it.wikipedia.org/wiki/~Abd_Allāh_al-Sallāl";
Console.WriteLine(url2.LastIndexOf("it.wikipedia.org/wiki/")); // 7
有问题的字符“ʿ”称为间距修饰符字母1。间距修饰符字母不是独立存在的,而是修饰字符串中的前一个字符,本例为“/”。另一种说法是它在渲染时不占用自己的空间。
LastIndexOf
,当不带StringComparison
参数调用时,使用当前区域性比较字符串。
当以文化敏感的方式比较字符串时,“/”和“ʿ”字符不会被视为两个不同的字符——它们被处理成一个字符,与传入的参数不匹配LastIndexOf
。
当您传递StringComparison.Ordinal
到LastIndexOf
时,由于序数比较的性质,字符被视为不同的。
完成这项工作的另一种方法是使用CompareInfo.LastIndexOf
和提供CompareOptions.IgnoreNonSpace
选项:
Console.WriteLine(
CultureInfo.CurrentCulture.CompareInfo.LastIndexOf(
wikiPageUrl, @"it.wikipedia.org/wiki/", CompareOptions.IgnoreNonSpace));
// 7
在这里,我们说我们不想组合字符串比较中包含的字符。
作为旁注,这意味着@Partha的答案和@Noctis 的答案仅起作用,因为该字符被应用于未出现在传递给的搜索字符串中的字符LastIndexOf
。
将此与Contains
默认情况下执行 Ordinal(区分大小写和区分区域性)比较的方法进行对比。这就解释了为什么Contains
退货true
和LastIndexOf
退货false
。
有关如何在 .NET 框架中操作字符串的精彩概述,请查看这篇文章。
1:这与组合字符不同还是一种组合字符?如果有人能为我解决这个问题,我将不胜感激。