使用使用ICU库进行字符串比较的.NET 6时,以下C#代码返回true:

Thread.CurrentThread.CurrentCulture = new CultureInfo("de-de");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-de");
"ß".Equals("SS", StringComparison.CurrentCultureIgnoreCase);  // false with ICU

据我所知,根据Unicode大小写折叠规则(以及更重要的是标准德语拼写规则),这应该是正确的:

00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S (CaseFolding.txt)

当使用遗留Microsoft NLS实现时,上述代码返回true.

那么,为什么.NET 6使用的ICU库与Unicode标准不同,或者我对标准的理解不正确?

Original C# question导致这个.

推荐答案

Unicode很复杂.

事实证明,这种行为是故意的.请参阅Github的this期专题,其中tarekgh总结了该问题:

ICU整理工作使用所谓的整理强度. 强度可以是初级强度、二级强度、三级强度或四级强度.我们 try 尽可能将.NET比较选项映射到 这些力量.除了在特殊情况下,它们工作得很好. 不幸的是,如果有ICU的实力,ICU只能让RST等于ss 是主要的.在.NET中,我们无法默认切换到该强度 因为这会 destruct 很多其他东西.

对于不区分大小写的比较,.NET使用的默认排序强度是第三级和第二级的(据我从代码中可以看出).

解决办法是使用StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) - CompareOptions.IgnoreNonSpace强制主要整理强度,在这种情况下,ßss将相等.

这种转变可能会有一些意想不到的副作用,但至少德语使用者会很高兴.

Csharp相关问答推荐

VS Code - C# - dotnet run找不到文件,但我可以打开并编辑它们吗?

获取Windows和Linux上的下载文件夹

Blazor:计算值或保留为默认值

需要深入了解NpgSQL DateTimeOffset处理

使用特定格式的JsonConvert序列化对象

为什么SignalR在每个Blazor服务器应用程序启动时最多启动8个服务器?

Appsettings.json未加载.Net 8 Blaazor Web程序集

使用可信第三方的Iext8.Net pdf签名

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

try 在.Net核心身份注册页面中使用AJAX,但没有成功..NET Core 5.0 Razor页面应用程序

在字符串C#之前获取数字

基于C#和ANGING的SignalR实时聊天流媒体应用

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

正在从最小API-InvocationConext.Arguments中检索参数的FromBodyAttribute

解决方案:延长ABP框架和ANGING OpenIddict中的令牌生命周期

Foreach非常慢的C#

为什么我在使用有效令牌的情况下仍未获授权?

.NET8支持Vector512,但为什么向量不能达到512位?

通过mini kube中的远程调试Pod与从emoteProcessPickerScript中解析错误输出的代码错误进行比较

在C#中删除多个不同名称的会话