V
Vasiliy23. Januar 2018 11:00

Запись в файл в utf-8

кодировка, C++, запись в файл

Нужно сохранить текст QString в файл в кодировке utf-8. Использую метод .toutf8, однако результирующий файл все равно получается в кодировке ascii, и на плеере, куда я загружаю текстовый файл, русские символы отображаются кракозябрами.

Вот все мои действия: я создают плейлист с помощью аимпа, сохраняю его. Насколько я знаю, сохраняется он в кодировке ascii. Далее открываю программу, загружаю этот созданный плейлист. Моя программа заменяет в нем пути к песням с одинх на другие и сохраняет получивший текст в новый файл.
Код
#include <QTextStream>
#include <QCheckBox>
#include <QString>
#include <QMessageBox>

using namespace std;

QString PathToFile, WhatReplace1, ReplaceFor1, WhatReplace2, ReplaceFor2, SaveAs1, SaveAs2, SaveAs3, TextNotChanged, Result1, Result2;
bool CopyPlayer=1;
int radiobutton=0;

QString MainWindow::FuncReplace(QString TextNotChangedF, QString WhatReplace, QString ReplaceFor)
{
    int i,j, LenTNC, LenWR;
    LenTNC=TextNotChangedF.size();
    LenWR=WhatReplace.size();
    QString Result;
    for(i=0;i<LenTNC;i++)
    {
      QString buffer;
      for(j=i;j<LenWR+i;j++)
      {
          buffer.append(TextNotChanged[j]);
      }

      if(buffer==WhatReplace)
      {
          Result.append(ReplaceFor);
          i+=LenWR;
      }
      Result.append(TextNotChangedF[i]);
}
    return (Result);
}
......
void MainWindow::on_pushButtonStart_clicked() //----------START----------
{
.....
    //Saving
    //File 1
    QFile Save1File(SaveAs1);
    Save1File.open(QFile::WriteOnly);
    QTextStream Save1stream(&Save1File);
    Save1stream<<Result1;
    Save1File.close();
    //File 2
    QFile Save2File(SaveAs2);
    Save2File.open(QFile::WriteOnly);
    QTextStream Save2stream(&Save2File);
    Save2stream<<Result2;
    Save2File.close();
    //File 3 (to player)
    CopyPlayer=ui->checkBox->checkState();
    if(CopyPlayer==1)
    {
        QFile Save3File(SaveAs3);

        Save3File.open(QFile::WriteOnly);
        QTextStream Save3stream(&Save3File);
        Save3stream<<Result1.toUtf8();
        Save3File.close();
    }
    setting();
}
Как можно добиться того, чтобы получаемый файл был в utf-8?

1.jpg
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

3
Evgenii Legotckoi
  • 23. Januar 2018 11:14
  • Die Antwort wurde als Lösung markiert.

Добрый день.

С кодировкой дело обстоит несколько хитрее, чем хотелось бы.
Во-первых, скорее всего сохраняет AIMP в кодировку "CP-1251", поскольку это в первую очередь виндовое приложение, а значит и сохранять он будет в эту кодировку.
Во-вторых, когда вы считываете данные, то нужно использовать QTextCodec, а вернее два, один преобразует данные из CP-1251 в Unicode, в котором работает QString, а второй скорее всего понадобится, чтобы вернуть текст в кодировке UTF-8.
Код посмотрите вот в этом топике .
    V
    • 25. Januar 2018 01:36

    Спасибо, получилось. Только еще понадобилось преобразовать строку в QByteArray. Функция теперь выглядит следующим образом:

    QString PathToFile, WhatReplace1, ReplaceFor1, WhatReplace2, ReplaceFor2, SaveAs1, SaveAs2, SaveAs3, TextNotChanged, Result1, Result2;
    bool CopyPlayer=1;
    int radiobutton=0;
    
    QString MainWindow::FuncReplace(QString TextNotChangedF, QString WhatReplace, QString ReplaceFor)
    {
        int i,j, LenTNC, LenWR;
        LenTNC=TextNotChangedF.size();
        LenWR=WhatReplace.size();
        QString Result1251;
        for(i=0;i<LenTNC;i++)
        {
          QString buffer;
          for(j=i;j<LenWR+i;j++)
          {
              buffer.append(TextNotChanged[j]);
          }
    
          if(buffer==WhatReplace)
          {
              Result1251.append(ReplaceFor);
              i+=LenWR;
          }
          Result1251.append(TextNotChangedF[i]);
        }
    
        QByteArray ArrayResul1251;
        ArrayResul1251.insert(0,Result1251);
        QTextCodec *Codec1251=QTextCodec::codecForName("Windows-1251"); //ob]9vlenie ob]ekta QTextCodec, konvertiruushego from chcp1251 to unicode
        QString ResultUnicode=Codec1251->toUnicode(ArrayResul1251); //convert to unicode
        QTextCodec *CodecUtf8=QTextCodec::codecForName("UTF-8"); //ob]9vlenie ob]ekta QTextCodec, konvertiruushego from unicode to utf-8
        QString ResultUtf=CodecUtf8->fromUnicode(ResultUnicode);
      return (ResultUtf);
    }

     

      V
      • 25. Januar 2018 12:28

      также  "QTextCodec *Codec1251=QTextCodec::codecForName("Windows-1251");" нужно заменить на " QTextCodec *Codec1251=QTextCodec::codecForLocale();", так как кодировка моей системы не Windows-1251, и многая кириллица отображалась некорректно, а какая кодировка используется моей виндой - я не знаю

        Kommentare

        Nur autorisierte Benutzer können Kommentare posten.
        Bitte Anmelden oder Registrieren
        Letzte Kommentare
        A
        ALO1ZE19. Oktober 2024 08:19
        Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов5. Oktober 2024 07:51
        Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas55. Juli 2024 11:02
        QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        k
        kmssr8. Februar 2024 18:43
        Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
        Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
        Jetzt im Forum diskutieren
        J
        JacobFib17. Oktober 2024 03:27
        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
        JW
        Jhon Wick1. Oktober 2024 15:52
        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
        КГ
        Кирилл Гусарев27. September 2024 09:09
        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
        F
        Fynjy22. Juli 2024 04:15
        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

        Folgen Sie uns in sozialen Netzwerken