Qt使用std :: use_facet和wstring

时间:2009-09-18 16:27:55

标签: c++ qt wstring

我需要跨平台代码来跳过宽字符串的前导空格。 它看起来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才能描述问题。

2 个答案:

答案 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关于本地化的附录的链接。