我需要跨平台代码来跳过宽字符串的前导空格。 它看起来g ++(显然Qt)根本没有为宽字符串初始化插槽 因此,以下代码适用于VC ++,但几乎g ++因bad_cast异常而失败:
#include <string>
#include <locale>
#include <iostream>
int main()
{
typedef std::ctype<std::wstring::value_type> vtct;
std::wstring str=L" 1122";
const std::wstring::value_type* unspace =
std::use_facet<vtct>( std::locale::classic() ).
scan_not(std::ctype_base::space|std::ctype_base::punct,
str.c_str(), str.c_str() + str.length());
//std::cout << unspace << std::endl;
wprintf(L"{%s}\n", unspace);
return 0;
}
根据规范:“语言环境对象中的构面存储库不包含具有所请求区域设置的构面:: id”
时的bad_cast异常一般问题g ++如何处理宽字符串?更狭隘的问题 - 如何至少为ctype初始化facet?
更新:经过一些实验,我发现linux g ++正确地初始化了facet for wide string - 所以代码可以工作。显然,只有mingw才能描述问题。
答案 0 :(得分:1)
您使用的是MingGW吗? 他们的稳定版don't support wchar_t。
我在Linux上的g ++中使用C ++宽字符支持(facets)也没有任何问题。
我必须让我的代码支持仅限窄字符的编译模式才能与MinGW一起使用。
答案 1 :(得分:0)
我尽量不使用STL本地化支持,因为:
由于您已经提到过Qt,您可以尝试从wstring创建一个QString,并使用QChar :: isSpace验证哪些字符是空格。
有关C ++本地化的更多帮助,请参阅this resource。它包含了B.Stroustrup关于本地化的附录的链接。