gpt4 book ai didi

c++ - 为什么我在关于文件编码格式的 qt 代码中得到乱码结果?

转载 作者:行者123 更新时间:2023-11-28 01:35:07 26 4
gpt4 key购买 nike

最近想学习qt如何对文件进行编解码。我测试了一些例子,但有些让我感到困惑。

这是我的代码:

#include <QApplication>
#include <QFile>
#include <QTextStream>

#define TEST(testFile) void test##testFile()

TEST(ANSI)
{
QFile inFile(":/test/test-ANSI.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;

QFile outFile("../test-ANSI-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;

QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");

// 这样写入会去掉换行符号
while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}

TEST(GB2312)
{
QFile inFile(":/test/test-GB2312.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;

QFile outFile("../test-GB2312-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;

QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");

while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}

TEST(utf8BOM)
{
QFile inFile(":/test/test-utf8-BOM.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;

QFile outFile("../test-utf8-BOM-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;

QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");

while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}

TEST(utf8)
{
QFile inFile(":/test/test-utf8.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;

QFile outFile("../test-utf8-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;

QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");

while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

testANSI();
testGB2312();
testutf8BOM();
testutf8();

return app.exec();
}

我输入的文字内容如下:

----
I love you!
我爱你!
。。。
1234
1234

对于ANSI、GB2312、utf8-BOM,我得到了输出文件例如:test-ANSI-bak.txt

----I love you!我爱你!。。。12341234

对于utf8,我得到了输出文件例如:test-utf8-bak.txt

----I love you!鎴戠埍浣狅紒銆傘€傘€12341234

为什么test-utf8-bak.txt会显示乱码?我很困惑!

最佳答案

QTextStream 正在根据输入文件内容猜测编解码器,对于非 BOM utf-8 文件,它猜测不正确。

如果您知道输入文件的格式,您应该调用 in.setCodec(),如果您不知道格式,您将不得不继续依赖 Qt 的猜测或编写您自己的编码探测器。

看起来 QTextStream 只查找 BOM,不做任何其他 Unicode 检测,来自 http://doc.qt.io/qt-5/qtextstream.html :

Automatic Unicode detection is also supported. When this feature is enabled (the default behavior), QTextStream will detect the UTF-16 or the UTF-32 BOM (Byte Order Mark) and switch to the appropriate UTF codec when reading

关于c++ - 为什么我在关于文件编码格式的 qt 代码中得到乱码结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49644540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com