在Qt中创建UTF-8文件

时间:2011-01-24 09:39:57

标签: 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;
    }

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

    fileOut.close();

    return 0;
}

我认为当QString默认为Unicode时,当我将输出流的编解码器设置为UTF-8时,我的文件将是UTF-8。但它不是,它是ANSI。 我做错了什么?我的琴弦有问题吗?你能纠正我的代码来创建UTF-8文件吗? 对我来说,下一步将是读取ANSI文件并将其保存为UTF-8文件,因此我将不得不对每个读取字符串执行转换,但现在,我想从一个文件开始。 谢谢。

3 个答案:

答案 0 :(得分:16)

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

QString unicodeString = "Some Unicode string";

你确实意识到,你不能只用引号中的Unicode字符串,对吗?默认情况下,QString使用Latin1,所以如果它只是重​​音字符,你可能会很好,但最好让你的源代码用UTF-8编码并执行此操作:

QString unicodeString = QString::fromUtf8("Some Unicode string");

这适用于任何可以想象的语言。使用QObject :: trUtf8()更好,因为它为您提供了大量的i18n功能。

修改

虽然您生成正确的UTF-8文件是正确的,但如果您希望记事本将您的文件识别为UTF-8,那么这是一个不同的故事。你需要在那里放一个BOM。它可以按照另一个答案中的建议完成,或者这是另一种方式:

streamFileOut.setGenerateByteOrderMark(true);

答案 1 :(得分:8)

我使用QT创建txt编码UTF-8而没有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();

该文件将编码没有BOM的UTF-8。

答案 2 :(得分:5)

不要忘记UTF-8编码会将ASCII字符编码为一个字节。只有特殊或加重的字符才会被编码为更多的字节(从2到6个字节)。

这意味着只要您拥有ASCII字符(您的unicodeString就是这种情况),该文件将只包含8个字节的字符。因此,您可以向后兼容ASCII:

  

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

要检查您的代码是否正常工作,您应该在unicode中添加一些突出显示的字符。

我用强调字符测试了你的代码,它运行正常。

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