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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Как преобразовать строку QString  (Прочитано 20435 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #30 : Февраль 29, 2012, 14:41 »

интересно почему у меня всё работает прекрасно в отладке с 4.8.0 (файл в кодировке utf-8):
Код
C++ (Qt)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QString s("привет");
qDebug() << s;
без кодека естественно выводится чёрт знает что
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vbi
Гость
« Ответ #31 : Февраль 29, 2012, 19:16 »

Потому что Вы его не преобразовываете в QByteArray
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #32 : Февраль 29, 2012, 20:04 »

если там заменить QString на QByteArray, ничего не изменится.

если же писать QByteArray b("\u2102\u2065\u2101\u2102"), то с этим по идее ничего нельзя поделать, поскольку системная кодировка - 1251, которая не воспринимает данные символы (об этом даже компилятор заботливо подсказывает).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
V1KT0P
Гость
« Ответ #33 : Февраль 29, 2012, 22:58 »

vbi
Только что проверил на 4.8.0 в debug и release при любых способах(естественно окроме toLatin1() для русских символов) работает прекрасно и в ini файле в нормальном UTF-8.
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec *textCodec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(textCodec);
    QTextCodec::setCodecForLocale(textCodec);
    QTextCodec::setCodecForTr(textCodec);

    MainWindow w;
    w.show();
   
    return a.exec();
}

Код:
void MainWindow::on_loadText_clicked()
{
    QSettings settings("settings.ini", QSettings::IniFormat);
    settings.setIniCodec("UTF-8");
    ui->testEdit->setText(settings.value("TestEdit").toString());
    QByteArray s;
    QString text = settings.value("TestEdit").toString();
    qDebug() << text;
    s.append(text.toLocal8Bit());
    qDebug() << s;
    s = text.toAscii();
    qDebug() << s;
    s = text.toLatin1();
    qDebug() << s;
    s = text.toLocal8Bit();
    qDebug() << s;
    s = text.toUtf8();
    qDebug() << s;
}

void MainWindow::on_saveText_clicked()
{
    QSettings settings("settings.ini", QSettings::IniFormat);
    settings.setIniCodec("UTF-8");
    settings.setValue("TestEdit", ui->testEdit->text());
}

Тестовый проект: http://rghost.ru/36782654
Записан
vbi
Гость
« Ответ #34 : Март 01, 2012, 10:28 »

Скачал Ваш проект, собрал, запустил под отладкой. Ввел слово "Привет", нажал "Save Text", потом "Load Text" - в окне сообщений увидел:
Цитировать
Отладка запущена
"Ïðèâåò"
"Ïðèâåò"
"Ïðèâåò"
"НепонимающийНепонимающий"
"Ïðèâåò"
"Ïðèâåò"

Если не в отладке, а просто запустить приложение - то выводит нормально
Записан
vbi
Гость
« Ответ #35 : Март 01, 2012, 10:35 »

Вот мои настройки:
Записан
V1KT0P
Гость
« Ответ #36 : Март 01, 2012, 13:30 »

Вот мои настройки:
Вот гифка показывающая что у меня все работает: http://rghost.ru/36788574
У тебя какой версии Qt Creator? 2.4.0?
Записан
vbi
Гость
« Ответ #37 : Март 01, 2012, 18:47 »

Да у меня так тоже работает. Неработает когда я на эту кнопку нажимаю.
Записан
vbi
Гость
« Ответ #38 : Март 01, 2012, 18:48 »

Нет, 2.4.1:
Записан
V1KT0P
Гость
« Ответ #39 : Март 01, 2012, 19:38 »

Да у меня так тоже работает. Неработает когда я на эту кнопку нажимаю.
Да действительно какой-то странный баг. Пока не починят можно юзать вот такой костыль:
Код:
void customMessageHandler(QtMsgType type, const char *msg)
{
    QTextCodec *consoleCodec = QTextCodec::codecForName("CP1251");
    QTextStream error(stderr);
    error.setCodec(consoleCodec);
    error << QString::fromUtf8(msg) << endl << flush;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qInstallMsgHandler(customMessageHandler);

    QTextCodec *textCodec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(textCodec);
    QTextCodec::setCodecForLocale(textCodec);
    QTextCodec::setCodecForTr(textCodec);

    MainWindow w;
    w.show();
   
    return a.exec();
}
Записан
vbi
Гость
« Ответ #40 : Март 02, 2012, 11:53 »

Спасибо. Это конечно хорошо, но основная цель у меня не на экран выводить, а преобразовать в QByteArray. Я понял что проблема в отладчике, а релиз у меня прекрасно работает, так что этот кусок программы отлаживать не буду. Спасибо за ответы! Улыбающийся
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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