在C ++中不敏感的字符串比较

在不将字符串转换为全部大写或全部小写的情况下,在C ++中执行不区分大小写的字符串比较的最佳方式是什么?

请说明这些方法是否适用于Unicode,以及它们的便携性。


Boost包含一个方便的算法:

#include <boost/algorithm/string.hpp>
// Or, for fewer header dependencies:
//#include <boost/algorithm/string/predicate.hpp>

std::string str1 = "hello, world!";
std::string str2 = "HELLO, WORLD!";

if (boost::iequals(str1, str2))
{
    // Strings are identical
}

利用标准的char_traits 。 回想一下, std::string实际上是std::basic_string<char>的typedef,或者更明确地说是std::basic_string<char, std::char_traits<char> >char_traits类型描述了字符如何比较,如何复制,如何转换等等。您只需要在basic_string键入一个新字符串,并将其与您自己的不区分大小写的自定义char_traits一起提供。

struct ci_char_traits : public char_traits<char> {
    static bool eq(char c1, char c2) { return toupper(c1) == toupper(c2); }
    static bool ne(char c1, char c2) { return toupper(c1) != toupper(c2); }
    static bool lt(char c1, char c2) { return toupper(c1) <  toupper(c2); }
    static int compare(const char* s1, const char* s2, size_t n) {
        while( n-- != 0 ) {
            if( toupper(*s1) < toupper(*s2) ) return -1;
            if( toupper(*s1) > toupper(*s2) ) return 1;
            ++s1; ++s2;
        }
        return 0;
    }
    static const char* find(const char* s, int n, char a) {
        while( n-- > 0 && toupper(*s) != toupper(a) ) {
            ++s;
        }
        return s;
    }
};

typedef std::basic_string<char, ci_char_traits> ci_string;

详细信息请参阅本周数字29。


你是在谈论一个愚蠢的大小写敏感比较还是一个完整的规范化的Unicode比较?

哑比较不会找到可能相同但不是二进制相等的字符串。

例:

U212B (ANGSTROM SIGN)
U0041 (LATIN CAPITAL LETTER A) + U030A (COMBINING RING ABOVE)
U00C5 (LATIN CAPITAL LETTER A WITH RING ABOVE).

都是等价的,但它们也有不同的二进制表示。

也就是说,如果你计划支持韩文,泰文和其他亚洲语言,Unicode标准化应该是一个强制性的阅读。

另外,IBM几乎获得了大多数优化的Unicode算法的专利,并且使它们公开。 他们还维护一个实施:IBM ICU

链接地址: http://www.djcxy.com/p/13071.html

上一篇: insensitive string comparison in C++

下一篇: C# Exclamation Operator On Object