首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在关于文件编码格式的qt代码中出现了混乱的代码结果?

为什么我在关于文件编码格式的qt代码中出现了混乱的代码结果?
EN

Stack Overflow用户
提问于 2018-04-04 06:50:31
回答 1查看 85关注 0票数 0

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

这是我的密码:

代码语言:javascript
复制
#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();
}

我输入的文本内容如下:

代码语言:javascript
复制
----
I love you!
我爱你!
。。。
1234
1234

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

代码语言:javascript
复制
----I love you!我爱你!。。。12341234

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

代码语言:javascript
复制
----I love you!鎴戠埍浣狅紒銆傘€傘€12341234

为什么test-utf8-bak.txt会显示混乱的代码?我真搞不懂!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-04 07:02:29

QTextStream是根据输入文件内容猜测编解码器,对于非BOM utf-8文件它猜错了。

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

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

还支持自动Unicode检测。当启用此功能(默认行为)时,QTextStream将检测UTF-16或UTF-32 BOM (字节顺序标记),并在读取时切换到适当的UTF编解码器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49644540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档