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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование символов как Qt Designer  (Прочитано 10687 раз)
vertus
Гость
« : Сентябрь 26, 2011, 11:48 »

Всем доброго времени суток.

Программирую в VS 2010 под Windows и Unix используя qt.

Проблема в следующем: 
кирилический текст набранный в одной ОС отображается иероглифами в другой.

Выставлять разные кодеки для разных ОС пробывал, не помогает.

Но, весь текст написанных в формах Qt Desginer отображается нормально.

Посмотрел сгенерированный ui_ файл, там такой код:

Код:
setText(QApplication::translate("Dialog", "\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214", 0, QApplication::UnicodeUTF8));

Теперь вопрос: как в Qt прямо в коде программы генерировать такие строки?

Спасибо за внимание.
Записан
Rem Norton
Гость
« Ответ #1 : Сентябрь 26, 2011, 13:15 »

При помощи QString, QChar и цикла несложно преобразовать строку в такое представление. НО будет ли это решение верным? Можно поподробнее узнать о проблеме и, если не затруднит, код в студию!
Записан
vertus
Гость
« Ответ #2 : Сентябрь 26, 2011, 13:22 »

Довольно проблематично предоставить код, т.к. использование строк разбросано по большому множеству классов.

Могу в кратце предоставить алгоритм моих действий.

В самом начале устанавливаю кодеки используя вот эту простую функцию:

Код:
void setEncoding()
{
setlocale(LC_ALL, ".1251");
QLocale::setDefault(QLocale(QLocale::Russian, QLocale::RussianFederation));

#ifdef WIN32
QTextCodec *codec = QTextCodec::codecForName("WINDOWS-1251");
#else
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
#endif
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
}

Затем записываю данные в строки например так:

Код:
QString text = tr("Здесь текст кириллицей");

Все эти действия я делаю в Windows в IDE Visual Studiio.

Затем компилирую код в Unix, и переменная text отображает белеберду на экране.

Но, кириллический текст написанный на формах в Designer отображается нормально.
« Последнее редактирование: Сентябрь 26, 2011, 13:24 от vertus » Записан
andrew.k
Гость
« Ответ #3 : Сентябрь 26, 2011, 13:31 »

У тебя исходники в какой кодировке?

Может так?
Код
C++ (Qt)
#ifdef WIN32
QTextCodec *codec = QTextCodec::codecForName("WINDOWS-1251");
#else
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
#endif
QString text = tr("Здесь текст кириллицей");
text = codec->toUnicode ( text.toAscii () ) ;
 
« Последнее редактирование: Сентябрь 26, 2011, 13:34 от andrew.k » Записан
Rem Norton
Гость
« Ответ #4 : Сентябрь 26, 2011, 13:37 »

Или так:
Код
C++ (Qt)
QString text = tr(QString("Здесь текст кириллицей"). toUtf8());
 
Записан
andrew.k
Гость
« Ответ #5 : Сентябрь 26, 2011, 13:41 »

Или так:
Код
C++ (Qt)
QString text = tr(QString("Здесь текст кириллицей"). toUtf8());
 
Так неизвестно какой кодек будет использован (вообще говоря известно, просто в общем). А при помощи QTextCodec явно.
Записан
vertus
Гость
« Ответ #6 : Сентябрь 26, 2011, 13:45 »

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Сентябрь 26, 2011, 13:59 »

через notepad++ например сохрани в нужной кодировке (скажем, utf-8)
Записан

Изучением 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
Rem Norton
Гость
« Ответ #8 : Сентябрь 26, 2011, 14:02 »

Оба варианта показывают белеберду, при чем разную. А кто нибудь знает как поменять кодировку исходников в Visual Studio, может в этом дело?
Дело однозначно в этом.

А насколько принципиально использовать Visual Studio? Может попробовать Qt Creator? Там таких приколов нет.
Записан
vertus
Гость
« Ответ #9 : Сентябрь 26, 2011, 14:05 »

через notepad++ например сохрани в нужной кодировке (скажем, utf-8)

Не вариант, куча исходников.
Оба варианта показывают белеберду, при чем разную. А кто нибудь знает как поменять кодировку исходников в Visual Studio, может в этом дело?
Дело однозначно в этом.

А насколько принципиально использовать Visual Studio? Может попробовать Qt Creator? Там таких приколов нет.

Да, принципиально, корпоративная технология разработки ПО.
Записан
andrew.k
Гость
« Ответ #10 : Сентябрь 26, 2011, 14:09 »

Я тут подумал. Там #ifdef то не нужен.
Исходники то не меняются.

Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForName("WINDOWS-1251");
QString text = "Здесь текст кириллицей";
text = codec->toUnicode ( text.toAscii () ) ;
 
Возможно я где-то ошибся в коде, нужно просто правильно сконвертировать строчки из 1251 в юникод, который используется в qt.
Это если иходники в 1251 кодировке.
« Последнее редактирование: Сентябрь 26, 2011, 14:11 от andrew.k » Записан
andrew.k
Гость
« Ответ #11 : Сентябрь 26, 2011, 14:15 »

Ты пишешь setCodecForCStrings ( KOI8-R ), а строки то у тебя в 1251.
Конечно кракозябры будут. Должно быть безусловно setCodecForCStrings (1251) в твоем случае.
Записан
vertus
Гость
« Ответ #12 : Сентябрь 26, 2011, 14:18 »

Ты пишешь setCodecForCStrings ( KOI8-R ), а строки то у тебя в 1251.
Конечно кракозябры будут. Должно быть безусловно setCodecForCStrings (1251) в твоем случае.

Ты прав, но там возникала другая проблема, системные сообщения выводились белебердой.

Но я подправил функцию, сделал для QString KOI8-R, а для tr WINDOWS-1251:
Код:
void setEncoding()
{
setlocale(LC_ALL, ".1251");
QLocale::setDefault(QLocale(QLocale::Russian, QLocale::RussianFederation));

#ifdef WIN32
QTextCodec *codecTr = QTextCodec::codecForName("WINDOWS-1251");
QTextCodec *codecString = codecTr;
#else
QTextCodec *codecTr = QTextCodec::codecForName("WINDOWS-1251");
QTextCodec *codecString = QTextCodec::codecForName("KOI8-R");
#endif
QTextCodec::setCodecForTr(codecTr);
QTextCodec::setCodecForCStrings(codecString);
}

#endif

Всем спасибо, проблема решена.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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