The differences between StringComparison.InvariantCulture and StringComparison.Ordinal fairly easy to find, because Ordinal means the string is not normalized before it is compared. Therefore, we just need to compare the normalized string with the non-normalized string.
Finding the differences between StringComparison.InvariantCulture and StringComparison.CurrentCulture (or the differences between different CurrentCulture s) is a bit more complicated, but they exist.
Here is one example:
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
Or one that uses only ASCII characters:
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
Rasmus faber
source share