Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: vertus от Сентябрь 26, 2011, 11:48



Название: Преобразование символов как Qt Designer
Отправлено: 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 прямо в коде программы генерировать такие строки?

Спасибо за внимание.


Название: Re: Преобразование символов как Qt Designer
Отправлено: Rem Norton от Сентябрь 26, 2011, 13:15
При помощи QString, QChar и цикла несложно преобразовать строку в такое представление. НО будет ли это решение верным? Можно поподробнее узнать о проблеме и, если не затруднит, код в студию!


Название: Re: Преобразование символов как Qt Designer
Отправлено: vertus от Сентябрь 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 отображается нормально.


Название: Re: Преобразование символов как Qt Designer
Отправлено: andrew.k от Сентябрь 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 () ) ;
 


Название: Re: Преобразование символов как Qt Designer
Отправлено: Rem Norton от Сентябрь 26, 2011, 13:37
Или так:
Код
C++ (Qt)
QString text = tr(QString("Здесь текст кириллицей"). toUtf8());
 


Название: Re: Преобразование символов как Qt Designer
Отправлено: andrew.k от Сентябрь 26, 2011, 13:41
Или так:
Код
C++ (Qt)
QString text = tr(QString("Здесь текст кириллицей"). toUtf8());
 
Так неизвестно какой кодек будет использован (вообще говоря известно, просто в общем). А при помощи QTextCodec явно.


Название: Re: Преобразование символов как Qt Designer
Отправлено: vertus от Сентябрь 26, 2011, 13:45
Оба варианта показывают белеберду, при чем разную. А кто нибудь знает как поменять кодировку исходников в Visual Studio, может в этом дело?


Название: Re: Преобразование символов как Qt Designer
Отправлено: kambala от Сентябрь 26, 2011, 13:59
через notepad++ например сохрани в нужной кодировке (скажем, utf-8)


Название: Re: Преобразование символов как Qt Designer
Отправлено: Rem Norton от Сентябрь 26, 2011, 14:02
Оба варианта показывают белеберду, при чем разную. А кто нибудь знает как поменять кодировку исходников в Visual Studio, может в этом дело?
Дело однозначно в этом.

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


Название: Re: Преобразование символов как Qt Designer
Отправлено: vertus от Сентябрь 26, 2011, 14:05
через notepad++ например сохрани в нужной кодировке (скажем, utf-8)

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

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

Да, принципиально, корпоративная технология разработки ПО.


Название: Re: Преобразование символов как Qt Designer
Отправлено: andrew.k от Сентябрь 26, 2011, 14:09
Я тут подумал. Там #ifdef то не нужен.
Исходники то не меняются.

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


Название: Re: Преобразование символов как Qt Designer
Отправлено: andrew.k от Сентябрь 26, 2011, 14:15
Ты пишешь setCodecForCStrings ( KOI8-R ), а строки то у тебя в 1251.
Конечно кракозябры будут. Должно быть безусловно setCodecForCStrings (1251) в твоем случае.


Название: Re: Преобразование символов как Qt Designer
Отправлено: vertus от Сентябрь 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

Всем спасибо, проблема решена.