Russian Qt Forum
Ноябрь 05, 2024, 22:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Как преобразовать строку QString  (Прочитано 20319 раз)
vbi
Гость
« : Февраль 27, 2012, 16:46 »

Проблема вот в чем. На форме есть поле ввода. Вводим туда текст кирилический, например "тест". Этот текст потом сохраняется в .ini файл.

Если открыть этот файл, то фраза "тест" там будет представлена в форме последовательности из цифр и бекслешей.

Тоесть в файле, фраза "тест" сохранится как "\2102\2065\2101\2102".

Если я потом считываю это значение в поле ввода, оно там отображается нормально как "тест". Но если я считаю его не в поле ввода, а в переменную типа QString оно там остается в текстовом формате как "\2102\2065\2101\2102".

Как эту строку в переменной преобразовать обратно в строку "тест"?
Записан
vbi
Гость
« Ответ #1 : Февраль 27, 2012, 16:57 »

Или нет, даже проще. Допустим у меня на форме есть поле ввода "lineEdit". В него я ввел фразу "тест".

при нажатии на кнопку происходит следующее:

Код:
    QString s = ui->lineEdit->text();
Когда отладчиком проверяю что в "s", отладчик показывает "\2102\2065\2101\210", а не тест. Как его преобразовать в "тест"
Записан
mutineer
Гость
« Ответ #2 : Февраль 27, 2012, 17:00 »

Цитировать
QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character.
Это и есть "тест", просто в юникоде. У QString есть ряд методов для преобразования в нужную кодировку, пользуйся ими
Записан
vbi
Гость
« Ответ #3 : Февраль 27, 2012, 17:08 »

Та я и пробую:
Код:
    QByteArray s;

    s.append(ui->lineEdit->text());
    s = ui->lineEdit->text().toAscii();
    s = ui->lineEdit->text().toLatin1();
    s = ui->lineEdit->text().toLocal8Bit();
    s = ui->lineEdit->text().toUtf8();
В первых 3-х случаях присваиваются знаки вопросов. в последних 2-х  - кракозябры
Записан
mutineer
Гость
« Ответ #4 : Февраль 27, 2012, 17:11 »

А какая кодировка тебе нужна?
Записан
vbi
Гость
« Ответ #5 : Февраль 27, 2012, 17:14 »

ну по ходу кирилица. Нужно чтоб в "QByteArray s" присвоился "тест". тоесть если сделать:
Код:
qDebug() << s;
то чтоб вывелось слово "тест"
Записан
mutineer
Гость
« Ответ #6 : Февраль 27, 2012, 17:19 »

а сейчас в qDebug() что выводится? тот же самый юникод?
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Февраль 27, 2012, 17:25 »

ну по ходу кирилица.
Смеющийся Кирилических кодировок > 1
Цитировать
Нужно чтоб в "QByteArray s" присвоился "тест". тоесть если сделать:
Код:
qDebug() << s;
то чтоб вывелось слово "тест"
Нужно копать в сторону класса QTextCodec и его функций setCodecForCStrings() и setCodecForLocale().
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
vbi
Гость
« Ответ #8 : Февраль 27, 2012, 17:28 »

Если делать так:

Код:
   
    QByteArray s;
    s.append(ui->lineEdit->text());
    qDebug() << s;
    s = ui->lineEdit->text().toAscii();
    qDebug() << s;
    s = ui->lineEdit->text().toLatin1();
    qDebug() << s;
    s = ui->lineEdit->text().toLocal8Bit();
    qDebug() << s;
    s = ui->lineEdit->text().toUtf8();
    qDebug() << s;

На вывод идет:
Цитировать
Отладка запущена
"Непонимающий?"
"Непонимающий?"
"Непонимающий?"
"oano"
"N??µN?N?"
Записан
vbi
Гость
« Ответ #9 : Февраль 27, 2012, 17:28 »

в первых 3-х случаях - знаки вопроса (заминились смайлами)
Записан
vbi
Гость
« Ответ #10 : Февраль 27, 2012, 17:35 »

Теперь пробую так:
Код:
    QByteArray s;
    QTextCodec *codec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForTr(codec);
    s.append(ui->lineEdit->text());
    qDebug() << s;
    s = ui->lineEdit->text().toAscii();
    qDebug() << s;
    s = ui->lineEdit->text().toLatin1();
    qDebug() << s;
    s = ui->lineEdit->text().toLocal8Bit();
    qDebug() << s;
    s = ui->lineEdit->text().toUtf8();
    qDebug() << s;

получаю результат:

Цитировать
"òåñò"
"òåñò"
"Непонимающий?"
"òåñò"
"тест"
Записан
mutineer
Гость
« Ответ #11 : Февраль 27, 2012, 17:41 »

давай зайдем с другой стороны... Зачем тебе в дебаге видеть нормальную строку?
это ж явно не конечная цель. Где тебе строка нужна в нормальном виде?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Февраль 27, 2012, 17:47 »

Млин, вы такие смешные. В инишнике в качестве ключей могут быть _только_ экранированные символы не латиницы или неэкранированная латиница.
В качестве значений могут быть любые символы. Смотреть метод сет ини кодек у сеттингзов. Хз зачем ставить не утв8 (к-ый по дефолту, кажется)
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #13 : Февраль 27, 2012, 17:52 »

Только сейчас заметил, что в окно вывода ты QByteArray выводишь - ну дык и не будет русских букв там (в смысле в окне) никогда, ибо QtCreator скомпилирован с поддержкой уникода, a QByteArray этого самого уникода не понимает.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
mutineer
Гость
« Ответ #14 : Февраль 27, 2012, 17:53 »

Млин, вы такие смешные. В инишнике в качестве ключей могут быть _только_ экранированные символы не латиницы или неэкранированная латиница.
В качестве значений могут быть любые символы. Смотреть метод сет ини кодек у сеттингзов. Хз зачем ставить не утв8 (к-ый по дефолту, кажется)

Никто не говорил что .ini создается через сеттингс
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 22.