Получите юникод из lineEdit QT и запишите его в файл - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть код, который имеет lineEdit объект.Этот объект получает в него предложение на любом языке (не выбирается на каком языке), поэтому он должен поддерживать Unicode.Затем я должен извлечь из него Unicode и записать его в файл.

Моя проблема в том, что lineEdit превращает текст в простой ASCII и переводит его в QSring, прежде чем я смогу добраться до него такЯ снова и снова получаю спам.

Вот пример кода того, что я пытаюсь сделать:

bool MainWindow::write_file(QString path, QString data)
{
    QFile file( path );
    if (file.open(QIODevice::WriteOnly))
    {
        QTextStream stream( &file );
        stream << data.toUtf8() << endl; // tried this -> didn't work...
        stream << data << endl;
    }else

    {
        return false;
    }

    file.close();
    return true;
}

void MainWindow::on_pushButton_clicked()
{
    // ui->lineEdit->text bring to me the unicode into QString allready
    // how can encode the data to utf-8 BEFORE it get into QString?
    write_file(PYTHON_DB_COMMAND, ui->lineEdit->text());
}

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Установите кодировку потока текста :

QTextStream stream(&file);
stream.setCodec("UTF-8");
stream << data << endl; // you do NOT need to convert .toUtf8()
0 голосов
/ 30 ноября 2018

Вы путаете вещи.

Qt определенно поддерживает Unicode;QLineEdit::text() возвращает QString, который является последовательностью кодовых единиц UTF-16.То, что вы ошибаетесь, это часть ввода / вывода позже;в частности, вы неправильно используете QTextStream.

Давайте отложим это на мгновение.Простой способ записать содержимое UTF-8 здесь - просто открыть QFile и записать прямую строку, преобразованную в UTF-8.

QFile file(path);
if (file.open(QIODevice::WriteOnly)) {
    file.write(data.toUtf8());
    file.putchar('\n');
}

Straight QFile работает только с байтовыми последовательностями,то, что мы помещаем в нее, записывается в файл (кроме идиотского перевода новой строки в текстовом режиме, но я отвлекся);data.toUtf8() возвращает вашу строку, преобразованную из UTF-16 в UTF-8, и она записывается в файл без особых хлопот.

Что тогда будет с QTextStream?Итак, задача QTextStream состоит в том, чтобы предоставить помощникам возможность записывать текстовое содержимое в файлы (в некотором смысле, QTextStream означает QIODevice, что std::ostream означает std::streambuf 1 );как таковой, он предоставляет методы для простого вывода QString значений.

Однако QString состоит из кодовых единиц UTF-16, в то время как базовый файл ориентирован на байты, поэтому необходимо преобразование.Для этого QTextStream использует внутренний QTextCodec, который, если явно не задано с помощью setCodec, равен QTextCodec::codecFromLocale(), что в системе Windows обычно является устаревшимкодирование (например, windows-1252), неспособное представить большую часть Unicode;отсюда вопросительные знаки в вашем выводе.

Даже если явно использовать QString::toUtf8() и записать результат на QTextStream, это не поможет: поскольку он предназначен для записи text , он предполагает, что QByteArray, который вы передаете,Данные в формате UTF-8, поэтому преобразует их в QString, используя метод fromUtf8 , а затем записывает их (таким образом, они преобразуются с помощью вышеупомянутого кодека).

Итак, правильный путь, если вы хотите записать QString данные в файл в UTF-8 с использованием QTextStream, это сначала установить кодек в UTF-8, а затем прямовыведите QString s:

QFile file(path);
if (file.open(QIODevice::WriteOnly)) {
    QTextStream stream( &file );
    stream.setCodec("UTF-8");
    stream << data << endl;
}

Кстати

  • обычно нет необходимости использовать endl - помимо вывода новой строки, это также вызывает сброс файла, который обычноэто не то, что вам действительно нужно (и может снизить производительность записи, если выводится много строк);
  • вам не нужно явно вызывать close() для QFile - он автоматически закрывается при уничтожении (так что, в этом случае, в конце вашего метода).

Примечания

  1. к сожалению, это не совсем так;std::streambuf - это трехглавый монстр, поскольку он оборачивает «связанную последовательность символов» (= основной поток, такой как файл ОС) и «контролируемую последовательность символов» (= буферизацию), аналогично QFile, но он также обрабатывает преобразование кодовой страницы в соответствии с std::codecvt языковым аспектом, таким образом полностью смешивая семантику объекта (* std::streambuf последовательность байтов или последовательность текстовых символов?) и усложняя реализацию.

    Как обычно, iostreams остается отличной ссылкой на то, как не для разработки библиотеки ввода-вывода.

0 голосов
/ 29 ноября 2018

в вызове write_file добавьте ко второму параметру: .utf16() или .Unicode(), чтобы преобразовать QString в ваше Utf-представление.

Я не понимаю, что вы имеете в виду"снова и снова".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...