【问题标题】:Convert std::string to QString将 std::string 转换为 QString
【发布时间】:2011-05-19 07:02:30
【问题描述】:

我有一个 std::string content,我知道它包含 UTF-8 数据。我想将其转换为QString。我该怎么做,避免 Qt 中的 from-ASCII 转换?

【问题讨论】:

    标签: c++ string qt utf-8 qstring


    【解决方案1】:

    有一个名为fromUtf8QString 函数接受const char*

    QString str = QString::fromUtf8(content.c_str());
    

    【讨论】:

    • 更高效:QString::fromUtf8( content.data(), content.size() )
    • 在 C++ 标准中,不能保证 std::string 以 UTF8 编码(实际上未指定编码),所以这个答案并不完全正确。至少您应该通过断言检查编码。
    【解决方案2】:

    QString::fromStdString(content) 更好,因为它更健壮。另请注意,如果 std::string 以 UTF-8 编码,那么它应该给出与 QString::fromUtf8(content.data(), int(content.size())) 完全相同的结果。

    【讨论】:

    • 仅在 Qt5 中。在 Qt4 中,它使用 QString::fromAscii。
    • 这应该是公认的答案。但是,您的最后陈述不一定是正确的。在 C++ 标准中,不能保证 std::string 以 UTF8 编码(实际上未指定编码),因此 QString::fromUtf8(content.data(), int(content.size())) 可能会给出与 QString::fromStdString(content) 不同(而且也不正确)的结果。
    【解决方案3】:

    通常,进行转换的最佳方法是使用方法fromUtf8,但问题是当您的字符串依赖于语言环境时。

    在这些情况下,最好使用fromLocal8Bit。示例:

    std::string str = "ëxample";
    QString qs = QString::fromLocal8Bit(str.c_str());
    

    【讨论】:

      【解决方案4】:

      由于 Qt5 fromStdString 内部使用 fromUtf8,所以你可以同时使用:

      inline QString QString::fromStdString(const std::string& s) 
      {
      return fromUtf8(s.data(), int(s.size()));
      }
      

      【讨论】: