比较wstring与忽略大小写

时间:2009-07-01 09:16:26

标签: c++ string unicode stl

我确信之前会被问到但是找不到它。有没有内置的(即使用std :: wstring的方法或算法)方法对两个wstring对象进行不区分大小写的比较?

8 个答案:

答案 0 :(得分:28)

如果您不介意与Microsoft实现绑定,可以使用<string.h>

中定义的此功能
int _wcsnicmp(
   const wchar_t *string1,
   const wchar_t *string2,
   size_t count 
);

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

#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
}

答案 1 :(得分: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
}

答案 2 :(得分:3)

您可以使用std::tolower()将字符串转换为小写,或使用函数wcscasecmpc_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
  }
};

答案 3 :(得分:2)

您可以使用提升字符串算法库。它只是一个标题库,只要你不打算使用正则表达式。所以你可以很容易地做到这一点。

http://www.boost.org/doc/libs/1_39_0/doc/html/string_algo.html

答案 4 :(得分:2)

#include <algorithm>
#include <string>
#include <cstdio>


 bool icase_wchar_cmp(wchar_t a, wchar_t b)
{
  return std::toupper(a) == std::toupper(b);
}


bool icase_cmp(std::wstring const& s1, std::wstring const& s2)
{
  return (s1.size() == s2.size()) &&
             std::equal(s1.begin(), s1.end(), s2.begin(),
                              icase_wchar_cmp);
}



int main(int argc, char** argv)
{
  using namespace std;

  wstring str1(L"Hello"), str2(L"hello");

  wprintf(L"%S and %S are %S\n", str1.c_str(), str2.c_str(),
              icase_cmp(str1,str2) ? L"equal" : L"not equal");

  return 0;
}

答案 5 :(得分:2)

谈论英语吧?!虽然我会选择我可爱的Boost:)

bool isequal(const std::wstring& first, const std::wstring& second)
{
    if(first.size() != second.size())
        return false;

    for(std::wstring::size_type i = 0; i < first.size(); i++)
    {
        if(first[i] != second[i] && first[i] != (second[i] ^ 32))
            return false;
    }

    return true;
}

答案 6 :(得分:1)

如果你需要,字符串将总是进行不区分大小写的比较(当使用运算符==或!=时),那么一个可能的优雅解决方案是重新定义char_traits :: compare方法。

定义自己的结构。实施例

struct my_wchar_traits: public std::char_traits< wchar_t>
{
    static int compare( const char_type* op1, const char_type* op2, std::size_t num) 
    {
       // Implementation here... any of the previous responses might help...
    } 
};

然后,定义您自己的不区分大小写的字符串:

typedef std::basic_string< wchar_t, my_wchar_traits> my_wstring;

答案 7 :(得分:-1)

您可以使用mismatch()或lexicographical_compare()。这是由Scott Meyers在Effective STL第35项中提出的。