在Windows上使用C ++中的Unicode进行不区分大小写的搜索
-
06-07-2019 - |
题
昨天我问了一个类似的问题,但我知道我需要以不同的方式重新讨论它。
简而言之: 在Windows上的C ++中,当字符串采用unicode格式(wide char,wchar_t)时,如何对字符串(在另一个字符串内)进行不区分大小写的搜索,并且我不知道字符串的语言。我只是想知道针是否存在于大海捞针中。针的位置与我无关。
背景: 我有一个包含大量电子邮件正文的存储库。这些消息使用不同的语言(日语,德语,俄语,芬兰语;您可以命名)。所有数据都是Unicode格式,我将它加载到我的C ++应用程序中的宽字符串(wchar_t)(正文已被MIME解码,因此在我的调试器中我可以看到实际的日语,德语字符)。我不知道消息的语言,因为电子邮件消息不包含该细节,单个电子邮件正文也可能包含多种语言的字符。
我正在寻找像wcsstr这样的东西,但能够以不区分大小写的方式进行搜索。我知道在不知道文本语言的情况下,不可能从大写到小写进行100%正确的转换。我想要一个可以在99%的情况下工作的解决方案。
我正在使用带有C ++,STL和Boost的Visual Studio 2008。
解决方案
Boost String Algorithms有一个 icontains( )功能模板,可以做你需要的。
其他提示
您必须指定语言以进行不区分大小写的比较。例如在土耳其语中,'i'不是与'I'对应的小写字母。如果似乎没有指定语言,则使用隐式选择的语言进行比较。
您应该使用 ICU库,它支持遵循Unicode规则的Unicode正则表达式用于不区分大小写的匹配。该库以C / C ++和Java库的形式提供。许多其他语言(如Python)支持ICU库的包装器。
你可以将needle和haystack转换为小写(或大写),然后执行wcsstr()。