问题描述
我试图解决的问题是为一个公共库添加多个目标框架(NET45 之前和 NETSTANDARD2.0 新)。该库包含许多用于对字符串进行排序的实用程序类。我想找到保持 .NET 5.0 应用程序具有与以前相同的排序结果的最佳方法。我想知道最好的方法是什么。
这是一个例子。
在 .NET Frameworks 4 和 .NET 5 中比较 .
和 -
将返回不同的顺序。这是一个重大变化。
两个运行时的结果是:
-
.NET Frameworks 4.7:-1,这意味着
.
_ - https://dotnetfiddle.net/I0yIr6 -
.NET 5.0:1 表示
.
>_
- https://dotnetfiddle.net/6YQCmA
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
// returns -1 in NET47 but returns 1 in NET5_0
Console.WriteLine(string.Compare(".","_",StringComparison.InvariantCulture));
Console.WriteLine(string.Compare(".",StringComparison.CurrentCulture));
var cultureInfo = new CultureInfo("en-US",false);
Console.WriteLine(string.Compare(".",true,cultureInfo));
}
}
解决方法
自然语言系统 确定 .NET 是对 Windows 应用程序使用国家语言支持 (NLS) 还是 Unicode 国际组件 (ICU) 全球化 API。 .NET 5.0 及更高版本在 Windows 2019 年 5 月 10 日更新及更高版本上默认使用 ICU 全球化 API。
- 如果省略此设置,.NET 将默认使用 ICU 全球化 API。这相当于将该值设置为 false。
Setting name Values
runtimeconfig.json System.Globalization.UseNls false - Use ICU globalization
true - Use NLS globalization
Environment variable DOTNET_SYSTEM_GLOBALIZATION_USENLS false - Use ICU globalization
true - Use NLS globalization