Różnice między StringComparison.InvariantCulture
i StringComparison.Ordinal
są dość łatwe do znalezienia, ponieważ porządkowe oznacza, że ciąg nie jest znormalizowany przed porównaniem. Musimy po prostu porównać znormalizowany ciąg do niezormowanego ciągu.
Znalezienie różnic między StringComparison.InvariantCulture
i StringComparison.CurrentCulture
(lub różnic między różnymi CurrentCulture
s) jest nieco trudniejsze, ale one istnieją.
Oto jeden z przykładów:
string a = "\u00C4"; // "LATIN CAPITAL LETTER A WITH DIAERESIS"
string b = "\u0041\u0308"; // "LATIN CAPITAL LETTER A" - "COMBINING DIAERESIS"
Console.WriteLine(a.Equals(b, StringComparison.InvariantCulture)); // true
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
Console.WriteLine(a.Equals(b, StringComparison.CurrentCulture)); // true
Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK", false);
Console.WriteLine(a.Equals(b, StringComparison.CurrentCulture)); // false
Console.WriteLine(a.Equals(b, StringComparison.Ordinal)); // false
Albo ten, który używa tylko znaków ASCII:
string ddzs = "ddzs";
string dzsdzs = "dzsdzs";
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
Console.WriteLine(ddzs.Equals(dzsdzs, StringComparison.CurrentCulture)); // false
Thread.CurrentThread.CurrentCulture = new CultureInfo("hu-HU", false);
Console.WriteLine(ddzs.Equals(dzsdzs, StringComparison.CurrentCulture)); // true
Dzięki, to jest dokładnie to, czego szukałem. Ma co najmniej dwa przykłady: \ u0000 jest taki sam jak pusty znak, jeśli parametr jest kulturą niezmienniczą, ale nie jeśli jest porządkowy. \ u0061 \ u030a jest taki sam jak \ u00e5, jeśli parametr jest kulturą niezmienniczą, ale nie jeśli jest porządkowy. – zod