将UTF-8文字流式传输到QTextStream中

时间:2016-10-29 11:35:20

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

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

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

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

这会失败,因为operator<<(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()包装器(或类似的)?

1 个答案:

答案 0 :(得分:2)

1)看起来确实很愚蠢,特别是如果你从文档中考虑这个引用:

  

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

2)您可以继承QTextStream并提供自己的operator<<。我不确定这是否是惯用的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 << "foo" << "bar"这样的链式调用,你可以使用更简单的版本:

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

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