C++ 中 Unicode 不区分大小写的搜索在 Windows 上

发布于 2024-08-09 00:15:58 字数 533 浏览 10 评论 0原文

我昨天问了类似的问题,但认识到我需要以不同的方式重新调整它。

简而言之: 在 Windows 上的 C++ 中,当字符串采用 unicode 格式(宽字符、wchar_t)并且我不知道字符串的语言时,如何对字符串(在另一个字符串内)进行不区分大小写的搜索。我只想知道大海捞针是否存在。针的位置与我无关。

背景: 我有一个包含很多电子邮件正文的存储库。这些信息采用不同的语言(日语、德语、俄语、芬兰语;应有尽有)。所有数据都是 Unicode 格式,我将其加载到 C++ 应用程序中的宽字符串 (wchar_t)(主体已进行 MIME 解码,因此在我的调试器中我可以看到实际的日语、德语字符)。我不知道消息的语言,因为电子邮件不包含该详细信息,而且单个电子邮件正文可能包含多种语言的字符。

我正在寻找类似 wcssstr 的东西,但能够以不区分大小写的方式进行搜索。我知道,在不知道文本语言的情况下,不可能 100% 正确地从大写字母转换为小写字母。我想要一个在 99% 可能的情况下都有效的解决方案。

我使用带有 C++、STL 和 Boost 的 Visual Studio 2008。

I asked a similar question yesterday, but recognize that i need to rephase it in a different way.

In short:
In C++ on Windows, how do I do a case-insensitive search for a string (inside another string) when the strings are in unicode format (wide char, wchar_t), and I don't know the language of the strings. I just want to know whether the needle exists in the haystack. Location of the needle isn't relevant to me.

Background:
I have a repository containing a lot of email bodies. The messages are in different languages (japanese, german, russian, finnish; you name it). All the data is in Unicode format, and I load it to wide strings (wchar_t) in my C++ application (the bodies have been MIME decoded, so in my debugger I can see the actual japanese, german characters). I don't know the language of the messages since email messages doensn't contain that detail, also a single email body may contain characters from several languages.

I'm looking for something like wcsstr, but with the ability to do the search in a case insensitve manner. I know that it's not possible to do a 100% proper conversion from upper case to lower case, without knowing the language of the text. I want a solution which works in the 99% cases where it's possible.

I'm using Visual Studio 2008 with C++, STL and Boost.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

云柯 2024-08-16 00:15:58

您必须指定语言才能进行不区分大小写的比较。例如,在土耳其语中,“i”不是与“I”对应的小写字母。如果似乎未指定语言,则正在使用隐式选择的语言进行比较。

You have to specify the language to do case insensitive comparison. For example in Turkish, 'i' is NOT the lower case letter corresponding to 'I'. If the language appears not to be specified, then the comparison is being done with an implicitly selected language.

空名 2024-08-16 00:15:58

Boost String Algorithms has an icontains() function template which may do what you need.

看春风乍起 2024-08-16 00:15:58

您应该使用 ICU 库,它提供对 Unicode 正则表达式的支持,该正则表达式遵循大小写的 Unicode 规则 -不敏感的匹配。该库可作为 C/C++ 和 Java 库使用。许多其他语言(例如 Python)支持 ICU 库的包装器。

You should use the ICU library which provides support for Unicode regular expressions which follow the Unicode rules for case-insensitive matching. The library is available as C/C++ and Java libraries. Many other languages such as Python support a wrapper for the ICU libraries.

晌融 2024-08-16 00:15:58

您可以将needle和haystack都转换为小写(或大写),然后执行wcsstr()。

you could convert both needle and haystack to lowercase (or uppercase) then do the wcsstr().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文