Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: radislav72 от Сентября 30, 2011, 18:14



Название: Неправильная кодировка
Отправлено: radislav72 от Сентября 30, 2011, 18:14
Здравствуйте!
Возникла такая проблема:
В одном файле, описывающем класс формы, определен массив (не входящий в класс):
Код:
QString fields[fieldsCount][2] = {
    {QObject::tr("Номер"), "num"},
    {QObject::tr("Тип"), "mem_kind"},
    {QObject::tr("Дата"), "dt"},
    ...
};

При попытке заполнения элементами массива выпадающего списка они выводятся в непонятной кодировке:
Код:
    ui->cbFields->clear();
    for (int i = 0; i < nmsFilter::fieldsCount; i++)
        ui->cbFields->addItem(nmsFilter::fields[i][0], nmsFilter::fields[i][1]);
(http://s53.radikal.ru/i139/1109/8a/85b990738393.jpg) (http://www.radikal.ru)

Кодировка файла исходника- UTF-8
В файле pro прописано
Код:
CODECFORTR = UTF-8

В другом месте того же файла присутствует код типа
Код:
    ui->cbOperations->clear();
    ui->cbOperations->addItem(tr("больше"), "GREATER");
    ui->cbOperations->addItem(tr("меньше"), "LESS");

Здесь все работает как надо.

Пробовал также вызывать
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
но толку мало.

Как заставить строки из массива отображать в нужном виде?


Название: Re: Неправильная кодировка
Отправлено: maint от Сентября 30, 2011, 18:24
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));


Название: Re: Неправильная кодировка
Отправлено: radislav72 от Сентября 30, 2011, 19:55
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

Эффекта это тоже не дало. Зато методом перебора выяснил, что если вместо tr() использовать trUtf8(), то все нормально.

Но почему надо использовать "принудительное" преобразование в UTF-8, если оно уже как бі включено для tr() вообще?

В чем дело?


Название: Re: Неправильная кодировка
Отправлено: maint от Сентября 30, 2011, 20:29
странно, у меня в линухе этих 2 строчек вполне хватает


Название: Re: Неправильная кодировка
Отправлено: andrew.k от Октября 01, 2011, 01:15
Видимо у тебя массив инициализируется раньше вызова setCodecForTr.

Если строки инициализируются статически, то в мэйне setCodec* уже поздно.

Я использую примерно такой код.

Код
C++ (Qt)
class SetCodec
{
  SetCodec()
  {
     QTextCodec::setCodeForCStrings( ... );
     QTextCodec::setCodeForTr( ... );
  }
};
 
SetCodec __attribute__ ((init_priority (101))) setCodec;
 
int main(...)
{
 
}
 
 

Это заставляет компилятор инициализировать класс (SetCodec) еще до инициализации прочих статических переменных.
Тогда и проблем с кодировками быть не должно.


Название: Re: Неправильная кодировка
Отправлено: radislav72 от Октября 01, 2011, 07:03
Видимо у тебя массив инициализируется раньше вызова setCodecForTr.

Точно, как раз в этом и была проблема. Спасибо!


Название: Re: Неправильная кодировка
Отправлено: Авварон от Октября 01, 2011, 12:08
Видимо у тебя массив инициализируется раньше вызова setCodecForTr.

Если строки инициализируются статически, то в мэйне setCodec* уже поздно.

Я использую примерно такой код.

Код
C++ (Qt)
class SetCodec
{
  SetCodec()
  {
     QTextCodec::setCodeForCStrings( ... );
     QTextCodec::setCodeForTr( ... );
  }
};
 
SetCodec __attribute__ ((init_priority (101))) setCodec;
 
int main(...)
{
 
}
 
 

Это заставляет компилятор инициализировать класс (SetCodec) еще до инициализации прочих статических переменных.
Тогда и проблем с кодировками быть не должно.
Какой офигенно прямой и переносимый код.


Название: Re: Неправильная кодировка
Отправлено: andrew.k от Октября 01, 2011, 13:27
Код
C++ (Qt)
SetCodec __attribute__ ((init_priority (101))) setCodec;
 
Какой офигенно прямой и переносимый код.

А что виндовые компиляторы не понимают атрибутов?
Чем еще он такой непрямой?


Название: Re: Неправильная кодировка
Отправлено: radislav72 от Октября 01, 2011, 15:05
Цитировать
Какой офигенно прямой и переносимый код.
А как лучше ?


Название: Re: Неправильная кодировка
Отправлено: Alex Custov от Октября 02, 2011, 14:45
А что виндовые компиляторы не понимают атрибутов?
Чем еще он такой непрямой?

Это нестандартно, и никто не обязан это поддерживать. Если gcc использует строгие правила проверки, то и он это не скомпилирует.


Название: Re: Неправильная кодировка
Отправлено: andrew.k от Октября 02, 2011, 15:00
что за строгие правила проверки?


Название: Re: Неправильная кодировка
Отправлено: andrew.k от Октября 02, 2011, 15:01
Так какое решение этой проблемы? Не использовать статически инициализированные данные?


Название: Re: Неправильная кодировка
Отправлено: asvil от Октября 02, 2011, 15:44
хехе, у кого-то хватает силы еще поддерживать все компиляторы, как это делают тролли?


Название: Re: Неправильная кодировка
Отправлено: radislav72 от Октября 05, 2011, 13:53
Может, оптимальный выход тогда при инициализации использовать trUtf8 вместо tr ?
Код:
QString fields[fieldsCount][2] = {
    {QObject::trUtf8("Номер"), "num"},
    {QObject::trUtf8("Тип"), "mem_kind"},
    {QObject::trUtf8("Дата"), "dt"},
    ...
};


Название: Re: Неправильная кодировка
Отправлено: maint от Октября 05, 2011, 14:20
я использую, и это нравственно


Название: Re: Неправильная кодировка
Отправлено: maint от Октября 05, 2011, 14:22
хехе, у кого-то хватает силы еще поддерживать все компиляторы, как это делают тролли?

не надо опускатся до аккаунтов с политическим жаргоном.