在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