在Qt中创建UTF-8文件

Ond*_*sky 18 unicode qt4 utf-8

我正在尝试在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;
}
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*nov 16

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

QString unicodeString = "Some Unicode string";
Run Code Online (Sandbox Code Playgroud)

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

QString unicodeString = QString::fromUtf8("Some Unicode string");
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

streamFileOut.setGenerateByteOrderMark(true);
Run Code Online (Sandbox Code Playgroud)


小智 8

我通过QT创建没有BOM的UTF-8编码的经验如下:

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();
Run Code Online (Sandbox Code Playgroud)

该文件将编码UTF-8而不使用BOM.


Jér*_*ôme 5

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

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

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

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

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

如果要在文件开头有BOM,可以先添加BOM字符(QChar(QChar::ByteOrderMark)).