我试图比较两个忽略这个案例的字符,并想出了以下令人不安的代码,试图与现在着名的土耳其人玩:
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还是两者都是假的)。
使用土耳其文化时:
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
结果发生变化,两者都返回True。
我是否想念文化或字符/字符串比较?
修改
阅读this question,我现在明白两者是不同的。它与比较字符或字符串无关,而是处理自己的情况与否。我不明白的是他们与众不同的原因。不是string.Equals与CurrentCultureIgnoreCase应该像我一样比较字符串的大写版本吗?我无法看到的幕后背景是什么?
答案 0 :(得分:0)
我猜测不区分大小写的比较可能适用于小写字母。
有了这个假设,第一次比较是'ı'.ToUpper* = 'I'
vs 'I'.ToUpper = 'I'
=> true
。
第二个比较是"ı".ToLower = "ı"
vs "I".ToLower = "i"
=> false
。
要进行测试,如果测试大写比较与小写比较和不区分大小写的比较,只使用字符串和仅使用字符,则应该得到相同的惊人结果。您可以从'ı'
和'I'
与'i'
和'İ'
开始进一步分析。
*:这是至关重要的一点,我假设鉴于法语没有字母'ı'
,假设它的大写字母版本为'I'
,就像土耳其语一样。
答案 1 :(得分:0)
在Equals检查中没有明确的ToUpper或ToLower。
我的猜测是检查是否存在可以将一个更改为另一个的套管规则,反之亦然。
土耳其人和法国人都可以将“ı”大写成“I”。但只有土耳其人才能进行相反的转换,所以只有那些人物被认为是“等同于无视的情况”。