Unicode 在Qt中创建UTF-8文件

Unicode 在Qt中创建UTF-8文件,unicode,utf-8,qt4,Unicode,Utf 8,Qt4,我正在尝试在Qt中创建一个UTF-8编码文件 #include <QtCore> int main() { QString unicodeString = "Some Unicode string"; QFile fileOut("D:\\Temp\\qt_unicode.txt"); if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text)) { return -1;

我正在尝试在Qt中创建一个UTF-8编码文件

#include <QtCore>

int main()
{
    QString unicodeString = "Some Unicode string";
    QFile fileOut("D:\\Temp\\qt_unicode.txt");
    if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        return -1;
    }

    QTextStream streamFileOut(&fileOut);
    streamFileOut.setCodec("UTF-8");
    streamFileOut << unicodeString;
    streamFileOut.flush();

    fileOut.close();

    return 0;
}
#包括
int main()
{
QString unicodeString=“一些Unicode字符串”;
QFile文件输出(“D:\\Temp\\qt_unicode.txt”);
如果(!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
{
返回-1;
}
QTextStream streamFileOut(&fileOut);
streamFileOut.setCodec(“UTF-8”);
streamFileOut不要忘记编码将ASCII字符编码为一个字节。只有特殊字符或重音字符将编码为更多字节(从2到6个字节)

这意味着,只要您有ASCII字符(这是您的
unicodeString
),文件将只包含8字节字符。因此,您可以获得与ASCII的向后兼容性:

UTF-8可以表示Unicode字符集中的每个字符,但与它们不同,UTF-8具有向后兼容ASCII的优点

要检查您的代码是否正常工作,您应该在unicode中输入一些重音字符

我用重音字符测试了你的代码,它运行得很好


如果您想在文件开头添加一个字符,可以先添加BOM字符(
QChar(QChar::ByteOrderMark)
)。

您的代码绝对正确。我唯一怀疑的部分是:

QString unicodeString = "Some Unicode string";
您确实意识到,您不能将Unicode字符串放在引号中,是吗?默认情况下,QString使用拉丁文1,因此,如果它只是关于重音字符,您可能没问题,但最好将源代码用UTF-8编码,然后执行以下操作:

QString unicodeString = QString::fromUtf8("Some Unicode string");
这适用于任何可以想象的语言。使用QObject::trUtf8()会更好,因为它提供了很多i18n功能

编辑

虽然确实生成了正确的UTF-8文件,但如果您希望记事本将您的文件识别为UTF-8,情况就不同了。您需要在其中放入BOM表。可以按照另一个答案中的建议执行,也可以通过以下另一种方式执行:

streamFileOut.setGenerateByteOrderMark(true);

我在创建txt编码UTF-8而不使用QT作为BOM的经验如下:

file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8"); // ...
vcfline = ctn; //assign some utf-8 characters
out.setGenerateByteOrderMark(false);
out << vcfline; //.....
file.close();
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(文件(&F);
out.setCodec(“UTF-8”);/。。。
vcfline=ctn;//分配一些utf-8字符
out.setGenerateByteOrderMark(false);

您应该使用QString::fromUtf8()将字符串文字转换为字符串。此外,一些编译器在源文件(MSVC)中的非ascii编码方面存在问题因此,如果在遇到类似问题时,我也可以尝试在输入字符串时工作。我也建议在遇到这样的问题时定义QtQuyNaskasfasyasCII和QTyNoxCaspto-asiCII。它禁止隐式转换,从而使正在发生的事情变得更清楚。我不建议在UTF-8:)中保留C++源,Piotr,为什么?UTF-8(没有BOM)是一种与US-ASCII完全兼容并支持任何语言的编码。除此之外,如何在某些本机语言中使用字符文字,而不必求助于QTextStream::setCodecForCStrings()“这会导致很多问题吗?”Sergey。我不得不同意Piotr的观点。问题是,当源文件中有非ASCII文本时,就要由预处理器和编译器来决定如何避免损坏它们。我毫不怀疑大多数现代工具都能处理它。但为什么要让它去碰运气呢?@Ondrej,请注意,有些软件可能无法处理它们我喜欢BOM表,尤其是一开始就不支持Unicode的BOM表。即使没有它,它仍然是有效的UTF-8,因此是否将其放在那里取决于您是否计划使用生成的文件。BOM表对UTF-8文件没有任何意义,它是一个Microsoft-ism。谢谢Jerome,你帮了我一个BOM.File很好,但缺少BOM。我使用Sergey的方法将其添加到流中,但非常感谢您的帮助。如果您从文件中读取,请为输入和输出文件流设置编解码器。