为什么这个字符串(“'Abdul-Baha'”^^ mso:text @ de)不以“?”开头?

时间:2014-03-14 08:51:45

标签: c# string char startswith

"\"ʿAbdul-Baha'\"^^mso:text@de".StartsWith("\"") // is false
"\"Abdul-Baha'\"^^mso:text@de".StartsWith("\"") // is true
(int)'ʿ' // is 703`

有人能告诉我为什么?

1 个答案:

答案 0 :(得分:2)

您需要使用函数BeginsWith的第二个参数; StringComparison.Ordinal(或StringComparison.OrdinalIgnoreCase)。这指示函数按字符值进行比较,并且不考虑有关排序的文化信息。该引用来自以下MSDN链接:

“使用单词排序规则的操作执行文化敏感的比较,其中某些非字母数字Unicode字符可能具有分配给它们的特殊权重。使用单词排序规则和特定文化的约定,连字符(” - “)可能会分配一个非常小的权重,以便”coop“和”co-op“在排序列表中彼此相邻。”

这似乎影响了BeginsWith的表现取决于语言环境/文化(参见OP帖子的评论) - 它适用于某些人,但不适用于其他人。

在下面的示例(单元测试)中,我展示了如果将字符串转换为char数组并查看第一个字符,它实际上是相同的。调用BeginsWith函数时,需要添加Ordinal比较以获得相同的结果。

作为参考,我的语言环境是瑞典语。

有关详细信息:MSDN: StringComparison Enumeration

[Test]
public void BeginsWith_test()
{
    const string string1 = "\"ʿAbdul-Baha'\"^^mso:text@de";
    const string string2 = "\"Abdul-Baha'\"^^mso:text@de";

    var chars1 = string1.ToCharArray();
    var chars2 = string2.ToCharArray();

    Assert.That(chars1[0], Is.EqualTo('"'));
    Assert.That(chars2[0], Is.EqualTo('"'));

    Assert.That(string1.StartsWith("\"", StringComparison.InvariantCulture), Is.False);
    Assert.That(string1.StartsWith("\"", StringComparison.CurrentCulture), Is.False);
    Assert.That(string1.StartsWith("\"", StringComparison.Ordinal), Is.True); // Works
    Assert.That(string2.StartsWith("\""), Is.True);
}