"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发送文本以折叠大小写。但必须有一个更好的方法。
答案 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
做得更好。
然而,它不会将大小写规范化为上限或下限,它只会折叠为规范形式。我建议您之后再申请 ToUpper
或 ToLower
。