为什么我在有关文件编码格式的QT代码中获得了混乱的代码

why I got the messy code result in my qt code about file encoding format?

本文关键字:代码 QT 混乱 获得了 格式 编码 文件 为什么      更新时间:2023-10-16

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

这是我的代码:

#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只在寻找BOMS,并且不会从http://doc.qt.io/qt-5/qtextstream.html进行任何其他Unicode检测。

也支持自动Unicode检测。当启用此功能(默认行为(时,QTEXTStream将检测UTF-16或UTF-32 BOM(字节订单标记(,然后在阅读时切换到适当的UTF编解码器。