2009-09-18 77 views
0

我需要跨平台的代码跳过开头的空格宽字符串。 它看起来是G ++(和Qt明显)在所有 所以下面的代码不会初始化宽字符串插槽工作正常,VC++,但几乎G ++失败bad_cast异常:的Qt使用的std :: use_facet与wstring的

#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; 
} 

,按照规范:“bad_cast当区域设置对象中的方面存储库不包含所请求的语言环境的方面时出现异常:: id“

所以一般问题g ++如何处理宽字符串?更窄的问题 - 如何初始化面至少为ctype?

更新:经过一些实验后,我发现linux g ++正确地初始化宽字符串的方面 - 所以代码工作。明显描述的问题是功能,如果只有mingw。

回答

0

我尽量不使用STL的本地化支持,因为:

  • 很复杂
  • ,据我所知,编译器的支持也不是那么好。

既然你提到过Qt,你可以尝试从wstring创建一个QString,并验证哪些字符是空间与QChar :: isSpace。

有关C++本地化的更多帮助,请参阅this resource。它包含一个链接到B.Stroustrup关于本地化的附录。

+0

我愿意把(它很复杂)。第二部分不是真实的,因为它不是提供本地化支持的编译器。它可能是默认提供的库,编译器对本地化没有很好的支持, – 2009-09-18 18:32:02

+0

@rpg - 感谢回复。它不是(-1),但是:对并发症强烈不同意。这在逻辑上是难以理解的。 QChar不能使用,因为代码必须是跨平台的,所以它必须以VC++编译为g ++。 – Dewfy 2009-09-19 06:20:47

+0

@马丁,你是对的,这是图书馆。 – rpg 2009-09-19 12:56:06

1

你在使用MingGW吗? 他们的稳定版本don't support wchar_t

我在Linux上的g ++中使用C++宽字符支持(facet)也没有任何问题。

我不得不让我的代码支持窄字符编译模式,以便与MinGW一起工作。

+0

@Basilevs看到我的编辑波纹管后 - linux的g ++工作得很好。 MinGW被Qt环境使用 - 这是我的问题。已定义wchar_t,但多个构面(包括ctype)不是。有谁知道如何做到这一点可能是手动? – Dewfy 2009-09-22 15:28:21

+0

已定义但不支持。使用gcc 4试用MinGW的版本。 – Basilevs 2009-09-23 06:22:53