字符、文化和忽略大小写的相等性比较

8

我试图比较两个字符,忽略大小写,并尝试通过以下混乱的代码来操作现在著名的土耳其字母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 不应该像我的方式一样比较字符串的大写版本吗?在幕后发生了什么我看不到的事情?


据我所记,在土耳其语中有两个不同的“i”。 - Graffito
1
这个问题的答案String比较 - strA.ToLower()==strB.ToLower() or strA.Equals(strB,StringComparisonType)?可能会对你有所帮助。 - Sayse
2
链接的问题不是这个问题的副本。 OP正在询问为什么在法国语言环境规则下,将字符大写并进行比较会导致相等,但在忽略大小写的情况下比较这些字符作为字符串时却不会。问题不是为什么在土耳其可以工作,而是为什么在任何文化中,字符和字符串比较的结果可能会有所不同,这更加微妙。 链接问题的任何答案都没有试图回答这个问题,除了Skeetmeister说“大小写比较并不像你想象的那样简单”。 (这是真的。) - Jeroen Mostert
考虑以下情况:在法语中,将I转换为小写会得到i,而不是ı,因此如果大小写不敏感的字符串比较结果为True,则如果您比较字符串的小写版本,则这是不正确的。您抱怨在将字符串转换为大写后进行比较时出现错误,但实际上,大小写不敏感的字符串比较可能不会执行任何操作。(我没有深入研究算法或Unicode规则。) - Jeroen Mostert
2个回答

0

在Equals检查中没有明确的ToUpper或ToLower操作。

我猜测会检查是否有大小写规则可以相互转换。

土耳其语和法语都可以将“ı”大写为“I”。但只有土耳其语可以执行相反的转换,因此只有在那里这些字符被视为“忽略大小写相等”。


0

我猜不区分大小写的比较可能会在小写字母上起作用。

基于这一假设,第一个比较是 'ı'.ToUpper* = 'I' vs 'I'.ToUpper = 'I' => true。 第二个比较是 "ı".ToLower = "ı" vs "I".ToLower = "i" => false

为了测试,你应该只使用字符串和字符进行比较大小写、不区分大小写的比较,以便得到相同的令人惊讶的结果。你可以进一步分析从 'ı''I' 对比 'i''İ' 开始。

*:这一点至关重要,我假设法语没有字母'ı',因此它的大写版本被认为是土耳其语中的'I'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接