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

use*_*037 6 c# string startswith char

"\"?Abdul-Baha'\"^^mso:text@de".StartsWith("\"") // is false
"\"Abdul-Baha'\"^^mso:text@de".StartsWith("\"") // is true
(int)'?' // is 703`
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我为什么?

Joh*_*man 2

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

\n\n

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

\n\n

这似乎会影响 BeginsWith 的执行方式,具体取决于语言环境/文化(请参阅 OP 帖子的评论) - 它适用于某些人,但不适用于其他人。

\n\n

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

\n\n

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

\n\n

欲了解更多信息:MSDN:StringComparison Enumeration

\n\n
[Test]\npublic void BeginsWith_test()\n{\n    const string string1 = "\\"\xca\xbfAbdul-Baha\'\\"^^mso:text@de";\n    const string string2 = "\\"Abdul-Baha\'\\"^^mso:text@de";\n\n    var chars1 = string1.ToCharArray();\n    var chars2 = string2.ToCharArray();\n\n    Assert.That(chars1[0], Is.EqualTo(\'"\'));\n    Assert.That(chars2[0], Is.EqualTo(\'"\'));\n\n    Assert.That(string1.StartsWith("\\"", StringComparison.InvariantCulture), Is.False);\n    Assert.That(string1.StartsWith("\\"", StringComparison.CurrentCulture), Is.False);\n    Assert.That(string1.StartsWith("\\"", StringComparison.Ordinal), Is.True); // Works\n    Assert.That(string2.StartsWith("\\""), Is.True);\n}\n
Run Code Online (Sandbox Code Playgroud)\n