我试图比较两个字符,忽略大小写,并尝试通过以下混乱的代码来操作现在著名的土耳其字母i:
char lowerCase = 'ı'; // U+0131
char upperCase = 'I'; // regular upper i
// Displays True comparing the chars
Trace.WriteLine(char.ToUpper(lowerCase, CultureInfo.CurrentCulture) == char.ToUpper(upperCase, CultureInfo.CurrentCulture));
// Displays False comparing the strings
Trace.WriteLine(lowerCase.ToString().Equals(upperCase.ToString(), StringComparison.CurrentCultureIgnoreCase));
这两件事情都涉及到我的文化(法国),看起来做着同样的事情,但结果并不是我期望的(要么都是True,要么都是False)。
当使用土耳其文化:
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
结果会改变,两者都返回True。
关于 Culture 或者字符/字符串比较,我有什么遗漏吗?
编辑
阅读这个问题后,我现在明白了这两种方法的不同之处。与其说这与比较字符或字符串有关,不如说是处理大小写的方式不同。我不明白的是它们为什么不同。难道使用 CurrentCultureIgnoreCase 的 string.Equals 不应该像我的方式一样比较字符串的大写版本吗?在幕后发生了什么我看不到的事情?
True
,则如果您比较字符串的小写版本,则这是不正确的。您抱怨在将字符串转换为大写后进行比较时出现错误,但实际上,大小写不敏感的字符串比较可能不会执行任何操作。(我没有深入研究算法或Unicode规则。) - Jeroen Mostert