我尝试使用boost对两个std :: u16string实例进行不区分大小写的字符串比较。根据我的搜索,我需要生成一个我正在做的语言环境。
#include <boost/algorithm/string.hpp>
#include <boost/locale.hpp>
#include <locale>
#include <iostream>
int main() {
// Create the strings
std::u16string str1 = boost::locale::conv::utf_to_utf<char16_t>("unicode");
std::u16string str2 = boost::locale::conv::utf_to_utf<char16_t>("UNICODE");
// Create the locale
boost::locale::generator gen;
std::locale loc = gen("");
// Doesn't matter if I do this or not
//std::locale::global(loc);
// Try to compare
if (boost::iequals(str1, str2, loc)) {
std::cout << "EQUAL\n";
} else {
std::cout << "!EQUAL\n";
}
return 0;
}
这会导致std :: bad_cast异常:
terminate called after throwing an instance of 'std::bad_cast'
what(): std::bad_cast
我做错了什么?
答案 0 :(得分:1)
std::u16string
使用char16_t
(如您所知)。
boost::iequals
在内部使用std::toupper
来比较两个字符串。
std::toupper
需要std::ctype<cT>
中的构面支持,在我们的案例中ct = char16_t
。正如本answer中所解释的那样,标准不需要这种支持,因此在大多数实现中都缺乏这种支持。
facet std :: ctype需要专门化并放入使用的facet中,以支持字符类型的扩展,缩小和分类。 char16_t或char32_t没有现成的专门化。
所以你没有做错什么,支持就在那里。如果您确实需要16位unicode字符串支持,我建议您查看第三方库,例如Qt
,其中类QString
使用16位字符by default