4

当我像这样定义开尔文符号(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");

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

  • K - k=>ToLower=True - K=>ToLowerInvariant=False

在另一台电脑上我得到:

  • K - k=>ToLower=True - k=>ToLowerInvariant=True

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


笔记

  • 在两个系统上Thread.CurrentThread.CurrentCultureThread.CurrentThread.UICurrentCulture是相同的:"en-US"
  • 两者都在运行net5.0

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

  • 操作系统 =“Windows 10 专业版”
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

不工作的系统有以下设置:

  • OS =“Windows Server 2019”(实际上这是来自 Azure 的构建代理)
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
4

1 回答 1

1

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

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

这是因为我的本地开发系统是“Windows 10 Pro”,而 Azure 的 build-agent 有“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;
    }
}
于 2021-08-20T11:05:55.733 回答