我正在尝试在 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 文件,因此我必须对每个读取的字符串执行转换,但现在我想从一个文件开始。
谢谢。
2022 编辑:以下内容适用于 Qt 4。Qt 5 及更高版本默认使用 UTF-8,因此此答案不适用于最新的 Qt 版本。
你的代码是绝对正确的。我认为唯一可疑的部分是:
QString unicodeString = "Some Unicode string";
它看起来可疑的原因是 QString 在从 C 样式字符串文字构造时默认使用 Latin1 编码,因此如果您只想使用带重音的拉丁字符,您可能没问题,但使用除此之外的任何内容(西里尔语、中文) 、日语、希伯来语...)并且它不再正常工作。处理此问题的最佳方法是将源代码编码为 UTF-8,然后执行以下操作:
QString unicodeString = QString::fromUtf8("Some Unicode string");
这适用于任何可以想象的语言。使用 QObject::trUtf8() 甚至更好,因为它为您提供了很多 i18n 功能。
Edit
虽然您确实生成了正确的 UTF-8 文件,但如果您希望记事本将您的文件识别为 UTF-8,那就是另一回事了。您需要在其中放入 BOM。可以按照另一个答案中的建议来完成,或者这是另一种方式:
streamFileOut.setGenerateByteOrderMark(true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)