【问题标题】:Streaming UTF-8 literals into QTextStream将 UTF-8 文字流式传输到 QTextStream
【发布时间】:2017-03-12 03:33:50
【问题描述】:

我在一个 UTF-8 编码(Qt 5.7,GCC)的 C++ 源文件中执行以下操作:

QTextStream textStream(&file);
textStream.setCodec("UTF-8");
textStream << "Copyright ©" << endl;

生成的文件采用 UTF-8 编码,但 © 字符编码不正确。

这会失败,因为 operator&lt;&lt;(const char *string) 需要一个 Latin-1 字符串文字。由于源是 UTF-8,这不起作用。

我也知道如何解决这个问题:

QTextStream textStream(&file);
textStream.setCodec("UTF-8");
textStream << QString("Copyright ©") << endl;

这是可行的,因为 QString(const char *str) 需要一个 UTF-8 字符串文字。

我需要以这种方式输出大量文字字符串。我无法将它们全部包装到QString() 中。

我的问题:

1) 为什么QString 采用UTF-8 而QTextStream 却没有?考虑到 Qt 源代码必须是 UTF-8,这是否有意义?

2) 有没有办法在没有数百个 QString() 包装器(或类似的)的情况下解决这个问题?

【问题讨论】:

  • 似乎这是一个可能会在 Qt 6 中修复的错误(请参阅 code.qt.io/cgit/qt/qtbase.git/…
  • 你试过把它包装在QStringLiteral宏中吗?
  • @MrEricSir:是的,StringLiteral 似乎也可以工作。但主要问题(每个单字符串都需要包装)仍然存在。

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


【解决方案1】:

1) 看起来确实很愚蠢,尤其是如果您考虑到文档中的这句话:

在内部,QTextStream 使用基于 Unicode 的缓冲区,而 QTextCodec 是 QTextStream 使用它来自动支持不同的字符集。

2) 您可以从QTextStream 继承并提供您自己的operator&lt;&lt;。我不确定这是否是惯用的 Qt,但它确实有效。

struct UnicodedStream : QTextStream
{
    using QTextStream::QTextStream;

    template<typename T>
    UnicodedStream& operator<<(T const& t)
    {
        return static_cast<UnicodedStream&>(static_cast<QTextStream&>(*this) << t);
    }

    UnicodedStream& operator<<(char const* ptr)
    {
        return static_cast<UnicodedStream&>(*this << QString(ptr));
    }
};

如果您不关心使用像 x &lt;&lt; "foo" &lt;&lt; "bar" 这样的链式调用,您可以使用更简单的版本:

struct UnicodedStream : QTextStream
{
    using QTextStream::QTextStream;
    using QTextStream::operator<<;

    QTextStream& operator<<(char const* ptr)
    {
        return *this << QString(ptr);
    }
};

【讨论】:

  • 很好的答案,我们遇到了同样的事情。然而,简单的版本是非常危险的,因为(如果我没看错的话)它会默默地编译 x
  • 抱歉第二条评论。另请参阅 QTBUG-54942。 bugreports.qt.io/browse/QTBUG-54942.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2011-12-21
  • 2014-01-28
  • 1970-01-01
  • 2015-09-17
  • 2011-05-29
相关资源
最近更新 更多