6
"strasse".Equals("STRAße",StringComparison.InvariantCultureIgnoreCase)

这返回真。哪个是对的。不幸的是,当我将其中一个存储在 postgres 中时,它认为在进行不区分大小写的匹配时它们是不一样的(例如, with ~*)。我也用 citext 测试过。

因此,一种解决方案是预先折叠案例,从而将strasse这些值中的任何一个存储在另一列中。然后我可以索引并搜索匹配项。

我一直在寻找如何在 C# 中折叠大小写,但一直无法在 C# 中找到解决方案。显然,知识是存在的,因为它可以正确比较这些字符串,我只是找不到从哪里得到它。

一种解决方案是生成一个 perl 进程perl -E "binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while (<>) { print fc }",将这些管道的 C# 端也设置为 utf8,然后通过 perl 发送文本以折叠案例。但必须有比这更好的方法。

4

2 回答 2

0

string.Normalize(),它接受一个NormalizationForm参数。Michael Kaplan对此进行了详细介绍。他声称它比FoldStringW.

但是,它不会将大小写规范化为上限或下限,它只会折叠为规范形式。我建议你只是申请ToUpperToLower之后。

于 2020-12-29T23:14:47.087 回答
0

通过查看源代码,我最终发现这个实现的大部分都在一组名为 CompareInfo 的类中。

你可以在github.com/dotnet/runtime找到这些

这将我带到了这个页面,该页面提供了 .net 文化内容的内部运作线索。.NET 全球化和 ICU

似乎 dotnet 实际上完全依赖本机库来处理除序数操作之外的所有内容。

我会由此假设 .Net Framework 可能正在使用来自 Win32 的 NLS。为此,有一个看起来很有前途的FoldStringW方法。

对于 ICU,有Case Mappings的文档,我找到了u_strFoldCase方法。

于 2020-12-24T23:39:21.897 回答