Преобразование кодировки и формата конца строки
Задача: в каталоге/папке (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();
}
Вывод: