【问题标题】:Qt using std::use_facet with wstringQt 使用带有 wstring 的 std::use_facet
【发布时间】:2009-09-18 16:27:54
【问题描述】:

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

【问题讨论】:

    标签: c++ qt wstring


    【解决方案1】:

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

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

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

    【讨论】:

    • @Basilevs 看到我在下面的编辑帖子 - linux 的 g++ 工作得很好。 Qt 环境使用 MinGW - 这是我的问题。 wchar_t 已定义,但多个方面(包括 ctype)未定义。有人知道如何手动操作吗?
    • 已定义但不支持。尝试使用 gcc 4 的 MinGW 版本。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我只想说(这很复杂)。第二部分不正确,因为它不是提供本地化支持的编译器。可能是您的编译器默认提供的库对本地化没有很好的支持,
    • @rpg - 感谢您的回复。它不是(-1)而是:强烈反对复杂性。这在逻辑上是可以理解的。 QChar不能使用,因为代码必须是跨平台的,所以它必须被VC++编译为g++。
    • @Dewfy:g++ 和 VC++ 不支持 QChar 吗?如果我使用 Qt 库构建,我已经在 Linux 和 Windows 上使用过它。
    • @rpg 可能是我没有正确描述问题 - Qt 范围之外有跨平台库,它只使用 stl。所以 QChar 在那里不可用。当库在 Qt 下编译时 - 我得到了这种奇怪的效果,(请参阅我的更新)与 mingw lib 的可爱功能有关的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多