关于c#:ToLower vs ToLowerInvariant

ToLower vs ToLowerInvariant

我只是在寻找这两种方法产生不同结果的任何例子。首先,我访问了msdn页面,运行其中的代码,并做了一些小的更改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Globalization;
using System.Linq;

class Program
{
    static void Main()
    {
        string[] words = {"Tuesday","Sal?","Вторник","Mardi",
                        "Τρ?τη","Martes","??? ?????",
                        "????????","?????????" };
        Console.BufferHeight = 1000;
        var test = CultureInfo.GetCultures(CultureTypes.AllCultures)
                              .Select(ci =>
                                      {
                                          string[] wordsToLower = words.Select(x => x.ToLower(ci)).ToArray();
                                          string[] wordsToLowerInvariant = words.Select(x => x.ToLowerInvariant()).ToArray();
                                          return new
                                                 {
                                                     Culture = ci,
                                                     ToLowerDiffers = !wordsToLower.SequenceEqual(wordsToLowerInvariant)
                                                 };
                                      })
                              .ToArray();
        foreach (var x in test)
        {
            Console.WriteLine("Culture {0}, ToLower and ToLowerInvariant produces different results: {1}", x.Culture, x.ToLowerDiffers);
        }
        Console.WriteLine();
        Console.WriteLine("Difference exists for any ToLower call: {0}", test.Any(x => x.ToLowerDiffers));
    }
}

但这里我有一个问题:这个代码为所有现有文化中的ToLowerToLowerInvariant调用生成相同的输出。

所以问题是:有任何字符串可以为这个测试产生不同的结果吗?


试试土耳其点的?

1
2
3
4
5
6
7
8
var culture = new CultureInfo("tr-TR");

string test ="?";

if (test.ToLower(culture) == test.ToLowerInvariant())
    Console.WriteLine("Same");
else
    Console.WriteLine("Different"); // Prints this!


XXXInvariant假定区域性设置为默认设置。为了能够显示差异,您应该演示tolower和tolowerinvariant,其文化信息与设置中的默认文化不同。默认情况下,默认的区域性是系统区域性。

因此,如果系统的文化是en-us,并且代码中只使用en-us字符,tolower和tolowerinvariant将给出相同的结果。

据我所知,如果你换"sal"?对于tolowerinvariant后面的"sali",您应该得到"sali"。