Привет лор!
Возникла необходимость сравнивать русский текст регистронезависимо. Для перевода в utf32 нашел такую штуку: http://utfcpp.sourceforge.net/
И вроде она работает, но возникает проблема: при вызове boost::iequals(u32string, u32string) вызывается toupper<char32_t>, который выбрасывает std::bad_cast, и что с этим делать непонятно.
#include <string>
#include <boost/algorithm/string/predicate.hpp>
#include "utf8.h"
using namespace std;
inline bool reliable_iequals(const string &str1, const string &str2)
{
u32string str1_32, str2_32;
utf8::utf8to32(str1.begin(), str1.end(), back_inserter(str1_32));
utf8::utf8to32(str2.begin(), str2.end(), back_inserter(str2_32));
return boost::iequals(str1_32, str2_32);
}
int main()
{
if(reliable_iequals("Одна строка", "ОДНА СтрОкА"))
cout << "reliable_iequals работает.\n";
else
cout << "reliable_iequals не работает.\n";
return 0;
}
terminate called after throwing an instance of 'std::bad_cast'
what(): std::bad_cast
Система - Fedora 19 x86_64
locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=