V
Vasiliy23 января 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
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

3
Evgenii Legotckoi
  • 23 января 2018 г. 11:14
  • Ответ был помечен как решение.

Добрый день.

С кодировкой дело обстоит несколько хитрее, чем хотелось бы.
Во-первых, скорее всего сохраняет AIMP в кодировку "CP-1251", поскольку это в первую очередь виндовое приложение, а значит и сохранять он будет в эту кодировку.
Во-вторых, когда вы считываете данные, то нужно использовать QTextCodec, а вернее два, один преобразует данные из CP-1251 в Unicode, в котором работает QString, а второй скорее всего понадобится, чтобы вернуть текст в кодировке UTF-8.
Код посмотрите вот в этом топике .
    V
    • 25 января 2018 г. 1: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 января 2018 г. 12:28

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

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        AD

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:50баллов,
        • Очки рейтинга-4
        m
        • molni99
        • 26 октября 2024 г. 8:37

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:80баллов,
        • Очки рейтинга4
        m
        • molni99
        • 26 октября 2024 г. 8:29

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:20баллов,
        • Очки рейтинга-10
        Последние комментарии
        i
        innorwall14 ноября 2024 г. 19:42
        Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
        i
        innorwall14 ноября 2024 г. 17:09
        Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
        i
        innorwall14 ноября 2024 г. 12:05
        EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
        i
        innorwall14 ноября 2024 г. 12:00
        PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты) priligy 30mg Am J Obstet Gynecol 171 1488 505
        Сейчас обсуждают на форуме
        i
        innorwall14 ноября 2024 г. 11:39
        добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
        i
        innorwall11 ноября 2024 г. 18:55
        Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
        9
        9Anonim25 октября 2024 г. 16:10
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
        ИМ
        Игорь Максимов3 октября 2024 г. 11:05
        Реализация навигации по разделам Спасибо Евгений!

        Следите за нами в социальных сетях