Преобразование кодировки и формата конца строки

Задача: в каталоге/папке (windows) есть какое-то количество файлов с разной кодировкой и разным форматом конца строк. Нужно, используя QT c++, привести все файлы в кодировку UTF-8 и CR LF.

Чаще всего файлы представляют собой код с комментариями cpp и h, но может быть и текстовый формат:

Исходный файл

Я гуглила, как можно реализовать, но возникла проблема, что русские комментарии испортились.

Код:

#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QTextStream>
#include <QTextCodec>
#include <QDebug>
#include <QFileDialog>
#include <QApplication>

// Функция для преобразования файлов в кодировку UTF-8 с концами строк CR+LF
void convertToUtf8AndCrlf(const QString& filePath) {

    // Открытие файла для чтения
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly)) {
        qWarning() << "Не удалось открыть файл для чтения:" << filePath;
        return;
    }

    // Чтение содержимого файла
    QTextStream in(&file);
    QString content = in.readAll(); // Читаем содержимое
    file.close();

    // Преобразование всех концов строк в формат CR+LF (\r\n)
    content.replace("\r\n", "\n");  // Преобразуем CR+LF -> LF
    content.replace("\r", "\n");    // Преобразуем CR -> LF
    content.replace("\n", "\r\n");  // Преобразуем LF -> CR+LF

    // Открытие файла для записи с перезаписью
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
        qWarning() << "Не удалось открыть файл для записи:" << filePath;
        return;
    }

    in.setCodec("UTF-8"); // Устанавливаем кодировку UTF-8

    // Запись содержимого в файл с кодировкой UTF-8 и концами строк CR+LF
    QTextStream out(&file);
    out.setCodec("UTF-8");  // Запись в кодировке UTF-8
    out << content;         // Записываем содержимое
    file.close();

    qDebug() << "Файл преобразован в UTF-8 и CR+LF:" << filePath;
}

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

    // Диалоговое окно для выбора каталога
    QString directoryPath = QFileDialog::getExistingDirectory(nullptr, "Выберите каталог для преобразования", "");

    // Если путь не выбран, выводим предупреждение и выходим
    if (directoryPath.isEmpty()) {
        qWarning() << "Каталог не был выбран.";
        return -1;
    }

    // Обработка выбранного каталога
    QDir dir(directoryPath);
    if (!dir.exists()) {
        qWarning() << "Каталог не существует:" << directoryPath;
        return a.exec();
    }

    // Получаем список файлов в каталоге
    QStringList files = dir.entryList(QDir::Files);
    for (const QString& file : files) {
        QString filePath = dir.absoluteFilePath(file);

        // Преобразуем файл
        convertToUtf8AndCrlf(filePath);
    }

    return a.exec();
}

Вывод:

Данные на выводе


Ответы (0 шт):