为什么这个字符串(" Abdul-Baha'"^^mso:text@de)不是'不是
本文关键字:quot 不是 mso text@de Abdul-Baha 字符串 为什么 | 更新日期: 2023-09-27 17:50:09
"'"ʿAbdul-Baha''"^^mso:text@de".StartsWith("'"") // is false
"'"Abdul-Baha''"^^mso:text@de".StartsWith("'"") // is true
(int)'ʿ' // is 703`
有人能告诉我为什么?
需要使用函数BeginsWith
的第二个参数;StringComparison.Ordinal
(或StringComparison.OrdinalIgnoreCase
)。这指示函数按字符值进行比较,并且在排序时不考虑文化信息。这句话来自下面的msdn链接:
"使用单词排序规则的操作执行对区域性敏感的比较,其中某些非字母数字Unicode字符可能被分配了特殊的权重。使用单词排序规则和特定文化的惯例,连字符("-")可能会被赋予非常小的权重,以便"coop"answers"co-op"在排序列表中相邻出现。"
这似乎会影响BeginsWith如何根据地区/文化执行(参见OP的帖子评论)-它适用于某些人,但不适用于其他人。
在下面的示例(单元测试)中,我展示了如果将字符串转换为字符数组并查看第一个字符,它实际上是相同的。当调用beginswith_function时,需要添加序数比较来获得相同的结果。
作为参考,我的语言环境是瑞典语。
获取更多信息: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);
}