7 / 7 / 0
Регистрация: 14.09.2013
Сообщений: 168
1

Сохранение в файл Юникод

14.09.2013, 20:29. Показов 3565. Ответов 13
Метки нет (Все метки)

Я пытаюсь сохранить в файл содержимое textEdit следующим образом:
C++ (Qt)
1
2
3
4
    QFile file("d:/file.txt");
    file.open(QIODevice::WriteOnly);
    file.write(ui->textEdit->toPlainText().toUtf8());
    file.close();
Но не могу сохранить буквы-умляуты (ö, ü, ä). Вместо них в файле появляется "абракадабра". Чтобы они были видны обычно используют Юникод. Как это реализовать
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.09.2013, 20:29
Ответы с готовыми решениями:

Сохранение таблицы из QtableWidget в файл
Сейчас, при сохранении данных файл, если я не вывел таблицу, программа ломается. Можно ли как то...

Сохранение значение переменной в файл
Подскажите пожалуйста как сохранить значение переменной в файл.

Сохранение размеров главной формы в файл
Нужно написать простенькую программку по следующему заданию: Вынести на форму чекбокс и если он...

Сохранение в бинарный файл В файле пусто
Всем привет, Прошу просветить. Не могу понять почему получаю пустой файл. Подскажите где...

13
154 / 110 / 9
Регистрация: 12.06.2013
Сообщений: 168
14.09.2013, 20:37 2
utf-8 - не юникод, что ли? Возможно, проблема в программе, которой вы просматриваете файл, она неправильно определяет кодировку файла.
1
7 / 7 / 0
Регистрация: 14.09.2013
Сообщений: 168
14.09.2013, 20:46  [ТС] 3
Цитата Сообщение от zenw Посмотреть сообщение
utf-8 - не юникод, что ли? Возможно, проблема в программе, которой вы просматриваете файл, она неправильно определяет кодировку файла.
Точно! Оказалось правильно. Я делал просмотр в Total Commander с помощью F3, теперь когда нажал F4 все в порядке.
Теперь другая проблема: если загрузить из файла эти буквы в textEdit, то уже тут "абракадабра". Читаю файл я так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
 QString str;
    QFile LicenseFile("d:/file.txt");
    if (!LicenseFile.open(QIODevice::ReadOnly | QIODevice::Text))return;
    QTextStream in(&LicenseFile);
    while (!in.atEnd())
    {
        str = in.readLine();
        ui->textEdit->append(str);
    }
 
    LicenseFile.close();
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
14.09.2013, 20:55 4
theadamo86, так все правильно. QString хранит данные в ASCII. Нужно делать как-то так:
C++ (Qt)
1
str = QString::fromUtf8(in.readLine());
2
7 / 7 / 0
Регистрация: 14.09.2013
Сообщений: 168
14.09.2013, 21:04  [ТС] 5
Цитата Сообщение от MastAKK Посмотреть сообщение
1
str = QString::fromUtf8(in.readLine());
Компилятор выдает ошибку:
D:\Code\Edit\dialog.cpp:38: ошибка: no matching function for call to 'QString::fromUtf8(QString)'
str = QString::fromUtf8(in.readLine());

^
Видимо QString::fromUtf8 не работает с потоком (QTextStream in). Можно ли прочитать файл не используя поток?
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
14.09.2013, 21:07 6
theadamo86, да... тупанул, попроюуйте
C++ (Qt)
1
str = in.readLine().toAscii();
1
7 / 7 / 0
Регистрация: 14.09.2013
Сообщений: 168
14.09.2013, 21:11  [ТС] 7
Цитата Сообщение от MastAKK Посмотреть сообщение
theadamo86, да... тупанул, попроюуйте
C++ (Qt)
1
str = in.readLine().toAscii();
in.readLine().toAscii() не было. Я попробовал in.readLine().toUtf8; не помогло.
0
7 / 7 / 0
Регистрация: 14.09.2013
Сообщений: 168
14.09.2013, 22:09  [ТС] 8
Не могу отобразить умляуты (ä, ü, ö) в textEdit прочитанные из файлы. Вместо них появляется какая-то абракадабра:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
//Загрузка из файла в textEdit
    QString str;
    QFile LicenseFile("d:/file.txt");
    if (!LicenseFile.open(QIODevice::ReadOnly | QIODevice::Text))return;
    QTextStream in(&LicenseFile);
    while (!in.atEnd())
    {
        str = in.readLine().toUtf8();
        ui->textEdit->append(str);
    }  
    LicenseFile.close();
Что можно предпринять?
0
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
14.09.2013, 22:17 9
Цитата Сообщение от theadamo86 Посмотреть сообщение
Что можно предпринять?
Попробовать побаловаться с кодировками? (QTextStream::setCodec())
2
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
14.09.2013, 22:26 10
theadamo86, пoпробуйте
C++ (Qt)
1
in.readLine().toLatin1();
1
1441 / 1322 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
14.09.2013, 22:35 11
Цитата Сообщение от MastAKK Посмотреть сообщение
QString хранит данные в ASCII.
Чё?
The QString class provides a Unicode character string.
QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character. (Unicode characters with code values above 65535 are stored using surrogate pairs, i.e., two consecutive QChars.)
Unicode is an international standard that supports most of the writing systems in use today. It is a superset of US-ASCII (ANSI X3.4-1986) and Latin-1 (ISO 8859-1), and all the US-ASCII/Latin-1 characters are available at the same code
C++ (Qt)
1
2
3
4
5
6
7
  QTextStream in(&LicenseFile);
  in.setCodec("UTF-8");
    while (!in.atEnd())
    {
        str = in.readLine();
        ui->textEdit->append(str);
    }
1
7 / 7 / 0
Регистрация: 14.09.2013
Сообщений: 168
14.09.2013, 22:58  [ТС] 12
Ура! Это сработало.

Добавлено через 59 секунд
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
QTextStream in(&LicenseFile);
* in.setCodec("UTF-8");
* * while (!in.atEnd())
* * {
* * * * str = in.readLine();
* * * * ui->textEdit->append(str);
* * }
0
Почетный модератор
11253 / 4206 / 425
Регистрация: 12.06.2008
Сообщений: 12,135
14.09.2013, 23:04 13
А зачем использовать QTextStream, если всё равно используется только readLine из него? readLine есть и в самом QFile, с той разницей, что QFile::readLine возвращает QByteArray, который можно представить в любой кодировке. В то время, как QTextStream::readLine возвращает QString, которому надо заранее через QTextStream::setCodec указывать кодировку файла.

В общем, предлагаю
C++ (Qt)
1
str = in.readLine();
заменить на
C++ (Qt)
1
str = QString::fromUtf8(LicenseFile.readLine());
А QTextStream вообще убрать можно.

И не надо в юникодовских приложениях использовать toAscii или toLatin1... это всё однобайтовые кодировки.
1
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
15.09.2013, 00:49 14
Dmitriy_M, хм, странно... да, я жестко ошибся, бывает Почему-то мне казалось, что они используют ASCII
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2013, 00:49

Сохранение фрэйма в файл как картинку
Здравствуйте! Есть фрэйм. И на нём в разные моменты могут динамически появляться лабели, или...

Сохранение данных в файл с определенной структурой
Здравствуйте. Сразу к делу. Нужно сохранять текстовые данные в файл с определенной структурой....

Сохранение умляутов (ä, ö, ü) из QStringList в файл
Как правильно сохранить данные переменной QStringList в файл, а именно умляуты (ä, ö,...

QString, юникод, и не понятное поведение
Известно что QString хранит символы юникода (16 бит как QChar). Но при использование (кодировка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru