比较wstring与忽略大小写

Nav*_*een 19 c++ string unicode stl

我相信以前会被问到但是找不到它.是否有任何内置(即使用std :: wstring的方法或算法)方式对两个wstring对象进行不区分大小写的比较?

Sta*_*tan 28

如果您不介意与Microsoft实现绑定,可以使用此中定义的此函数 <string.h>

int _wcsnicmp(
   const wchar_t *string1,
   const wchar_t *string2,
   size_t count 
);
Run Code Online (Sandbox Code Playgroud)

但是如果你想要最佳性能/兼容性/功能比,你可能不得不看一下boost库(其中一部分是stl).简单的例子(取自不同问题的不同答案):

#include <boost/algorithm/string.hpp>

std::wstring wstr1 = L"hello, world!";
std::wstring wstr2 = L"HELLO, WORLD!";

if (boost::iequals(wstr1, wstr2))
{
    // Strings are identical
}
Run Code Online (Sandbox Code Playgroud)

  • 字符串文字中缺少L编码前缀 (3认同)

Cal*_*lum 6

使用标准库:

bool comparei(wstring stringA , wstring stringB)
{
    transform(stringA.begin(), stringA.end(), stringA.begin(), toupper);
    transform(stringB.begin(), stringB.end(), stringB.begin(), toupper);

    return (stringA == stringB);
}

wstring stringA = "foo";
wstring stringB = "FOO";
if(comparei(stringA , stringB))
{
    // strings match
}
Run Code Online (Sandbox Code Playgroud)

  • 如果(stringA == stringB)迫使我发表评论!:)应该返回(stringA == stringB) (11认同)
  • 此解决方案在多个语言环境中不起作用,在某些语言中,当您转换为大写然后返回时,您将获得不同的字符串. (4认同)
  • 您不只是比较字符串,实际上,无论结果如何,您都将两个字符串都变为大写。尝试编写一个带有“bool Compare(const wstring stringA, const wstring stringB)”签名的方法,然后修复这个算法。 (3认同)

Chr*_*ris 5

您可以使用std::tolower()将字符串转换为小写或使用该函数wcscasecmp对 进行不区分大小写的比较c_str()

这是一个您也可以直接使用的比较函子:

struct ci_less_w
{
  bool operator() (const std::wstring & s1, const std::wstring & s2) const
  {
      #ifndef _WIN32
            return wcscasecmp(s1.c_str(), s2.c_str()) < 0;
      #else
            return _wcsicmp(s1.c_str(), s2.c_str()) < 0;
      #endif
  }
};
Run Code Online (Sandbox Code Playgroud)