C# 中开尔文符号 (K) 的 ToLowerInvariant 具有不同的结果

ToLowerInvariant from a Kelvin Sign (K) in C# has different results

当我这样定义开尔文符号 (http://www.unicode-symbol.com/u/212A.html) 时:

var kelvinSign = "K";

并执行控制台写入:

Console.WriteLine("{0} - {1}=>ToLower={2} - {3}=>ToLowerInvariant={4}",
                kelvinSign,
                kelvinSign.ToLower(), kelvinSign.ToLower() == "k",
                kelvinSign.ToLowerInvariant(), kelvinSign.ToLowerInvariant() == "k");

我在一台电脑上得到这个输出:

在另一台电脑上我得到:

这表明 ToLowerInvariant() 方法的工作方式不同?


备注


更新
有效的系统具有以下设置:

UseNls = False
CultureInfo.InvariantCulture =
CultureInfo.InvariantCulture.Name =
CultureInfo.InvariantCulture.CultureTypes = SpecificCultures, InstalledWin32Cultures
CultureInfo.InvariantCulture.DisplayName = Unknown language
CultureInfo.InvariantCulture.TwoLetterISOLanguageName = iv
CultureInfo.InvariantCulture.ThreeLetterISOLanguageName = ivl
CurrentCulture   = en-US
CurrentUICulture = en-US
K - k=>ToLower=True - k=>ToLowerInvariant=True

不工作的系统有这些设置:

UseNls = True
CultureInfo.InvariantCulture = 
CultureInfo.InvariantCulture.Name = 
CultureInfo.InvariantCulture.CultureTypes = SpecificCultures, InstalledWin32Cultures
CultureInfo.InvariantCulture.DisplayName = Invariant Language (Invariant Country)
CultureInfo.InvariantCulture.TwoLetterISOLanguageName = iv
CultureInfo.InvariantCulture.ThreeLetterISOLanguageName = ivl
CurrentCulture   = en-US
CurrentUICulture = en-US
K - k=>ToLower=True - K=>ToLowerInvariant=False

这个问题的原因是我想 运行 在我的 XPath2.Net 单元测试中使用 XPath 2.0 的完整测试集,并在所有系统上获得相同的结果。

但是 XQTS_1_0_2 : caselessmatch04 有不同的结果。

这是因为我的本地开发系统是“Windows 10 Pro”,而来自 Azure 的构建代理有“Windows Server 2019”,所以我的解决方案是检测是否 Nls 被使用。为此,我使用了 canton7:

中的代码示例
public static class GlobalizationUtils
{
    public static bool UseNls()
    {
        return (typeof(CultureInfo).Assembly.GetType("System.Globalization.GlobalizationMode")
            ?.GetProperty("UseNls", BindingFlags.Static | BindingFlags.NonPublic)
            ?.GetValue(null) as bool?) == true;
    }
}