如何解决.NET 5 中意外的 String.Compare() 结果
我试图解决的问题是为一个公共库添加多个目标框架(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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。