折叠盒加快比较

时间:2018-04-05 20:02:00

标签: c# case-folding

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

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

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

我一直在寻找如何在C#中折叠案例一段时间,并且无法在C#中找到解决方案。显然知识存在,因为它可以正确地比较这些字符串,我只是无法找到从哪里得到它。

一种解决方案是生成一个perl进程perl -E "binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while (<>) { print fc }",同时将进程的C#端设置为utf8,并通过perl发送文本以折叠大小写。但必须有一个更好的方法。

2 个答案:

答案 0 :(得分:0)

查阅资料后,我最终发现该实现的大部分内容都在一组名为 CompareInfo 的类中。

您可以在 github.com/dotnet/runtime

找到这些

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

似乎 dotnet 实际上完全依赖于原生库,除了序数操作。

我认为 .Net Framework 可能正在使用 Win32 中的 NLS。为此,FoldStringW 方法看起来很有希望。

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

答案 1 :(得分:0)

string.Normalize(),它需要一个 NormalizationForm 参数。迈克尔·卡普兰 goes into detail 对此。他声称它比FoldStringW做得更好。

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