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");
我在一台电脑上得到这个输出:
K - k=>ToLower=True - K=>ToLowerInvariant=False
在另一台电脑上我得到:
K - k=>ToLower=True - k=>ToLowerInvariant=True
这表明 ToLowerInvariant() 方法的工作方式不同?
备注
- 在两个系统上
Thread.CurrentThread.CurrentCulture
和 Thread.CurrentThread.UICurrentCulture
是相同的:"en-US"
- 都是运行net5.0
更新
有效的系统具有以下设置:
- OS = "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
这个问题的原因是我想 运行 在我的 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;
}
}
当我这样定义开尔文符号 (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");
我在一台电脑上得到这个输出:
K - k=>ToLower=True - K=>ToLowerInvariant=False
在另一台电脑上我得到:
K - k=>ToLower=True - k=>ToLowerInvariant=True
这表明 ToLowerInvariant() 方法的工作方式不同?
备注
- 在两个系统上
Thread.CurrentThread.CurrentCulture
和Thread.CurrentThread.UICurrentCulture
是相同的:"en-US"
- 都是运行net5.0
更新
有效的系统具有以下设置:
- OS = "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
这个问题的原因是我想 运行 在我的 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;
}
}