0

我需要跨平台代码来跳过宽字符串的前导空格。看起来 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;
}

根据规范:“当 locale 对象中的 facet 存储库不包含具有请求的 locale::id 的 facet 时出现 bad_cast 异常”

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

更新:经过一些实验,我检测到 linux g++ 正确初始化宽字符串的 facet - 所以代码可以工作。显然,如果仅 mingw,则描述的问题是特征。

4

2 回答 2

1

你在用MingGW吗?他们的稳定版本不支持 wchar_t

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

我必须让我的代码支持窄字符编译模式才能与 MinGW 一起使用。

于 2009-09-22T10:24:51.977 回答
0

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

  • 这很复杂
  • 据我所知,编译器支持不是很好。

由于您提到了 Qt,您可以尝试从 wstring 创建一个 QString,并使用 QChar::isSpace 验证哪些字符是空格。

有关C++ 本地化的更多帮助,请参阅此资源。它包括 B.Stroustrup 关于本地化的附录的链接。

于 2009-09-18T17:51:23.807 回答