我正在尝试在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文件,因此我将不得不对每个读取字符串执行转换,但现在,我想从一个文件开始。 谢谢。
答案 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)