Qt读取GBK编码的文本文件,转换成UTF-8编码后再保存?

时间:2023-01-05 20:48:48
in.txt的内容:
测试文本

共4个汉字,GBK编码,应该占用8字节。
期望转换成UTF-8编码,则转换后应该是12字节。

#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextStream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile infile("in.txt");

    if (!infile.open(QIODevice::ReadWrite | QIODevice::Text))
        return -1;

    QFile outfile("out.txt");

    if (!outfile.open(QIODevice::WriteOnly | QIODevice::Text))
        return -2;

    QTextStream instream(&infile);
    QTextStream outstream(&outfile);

    outstream.setCodec("utf-8");
    outstream << instream.readAll() << endl; // 为何没有endl就会乱码?转换失败?

    a.exit(0);
    return 0;
}


两个问题:
1. 注释处,为何必须得加一个endl才能成功?
2. 使用同一个QFile,以ReadWrite方式打开为何失败(以下是失败代码)?
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
        return -1;

    QTextStream stream(&file);
    QString text = stream.readAll();
    stream.setCodec("utf-8");
    stream << text << endl;
    qDebug() << stream.readAll();

    return a.exec();
}

4 个解决方案

#1


Windows + Qt 4.7.4 一切正常……

#2


第二个注意读写前先 seek()。
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
        return -1;

    QTextStream stream(&file);
    QString text = stream.readAll();
    stream.seek(0);
    stream.setCodec("utf-8");
    stream << text;
    stream.seek(0);
    qDebug() << stream.readAll();

    return 0;
}

#3


1. endl 是 iostream 的操纵子,不要和 Qt 的流混用。

2. 从可移植性考虑,最好还是在读入的时候也设置一下编码。

3. 第一段代码的问题可能是 QFile 比 QTextStream 先析构了,导致内容没有完全写入,可以自己手动关闭 stream 和 file 试试。

#4


#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("test.txt");
    if (file.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        QTextStream stream(&file);
        const QString &text = stream.readAll();
        stream.seek(0);
        stream.setCodec(QTextCodec::codecForName("utf-8"));
        stream.setGenerateByteOrderMark(true);
        stream << text;
        stream.seek(0);
        qDebug() << stream.readAll();
    }

    return 0;
}

#1


Windows + Qt 4.7.4 一切正常……

#2


第二个注意读写前先 seek()。
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
        return -1;

    QTextStream stream(&file);
    QString text = stream.readAll();
    stream.seek(0);
    stream.setCodec("utf-8");
    stream << text;
    stream.seek(0);
    qDebug() << stream.readAll();

    return 0;
}

#3


1. endl 是 iostream 的操纵子,不要和 Qt 的流混用。

2. 从可移植性考虑,最好还是在读入的时候也设置一下编码。

3. 第一段代码的问题可能是 QFile 比 QTextStream 先析构了,导致内容没有完全写入,可以自己手动关闭 stream 和 file 试试。

#4


#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("test.txt");
    if (file.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        QTextStream stream(&file);
        const QString &text = stream.readAll();
        stream.seek(0);
        stream.setCodec(QTextCodec::codecForName("utf-8"));
        stream.setGenerateByteOrderMark(true);
        stream << text;
        stream.seek(0);
        qDebug() << stream.readAll();
    }

    return 0;
}