我在一个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()
包装器(或类似的)?
答案 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);
}
};