Russian Qt Forum
Августа 29, 2025, 21:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Неправильная кодировка  (Прочитано 7113 раз)
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]);


Кодировка файла исходника- 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"));
но толку мало.

Как заставить строки из массива отображать в нужном виде?
Записан
maint
Гость
« Ответ #1 : Сентября 30, 2011, 18:24 »

Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
Записан
radislav72
Гость
« Ответ #2 : Сентября 30, 2011, 19:55 »

Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

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

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

В чем дело?
Записан
maint
Гость
« Ответ #3 : Сентября 30, 2011, 20:29 »

странно, у меня в линухе этих 2 строчек вполне хватает
Записан
andrew.k
Гость
« Ответ #4 : Октября 01, 2011, 01:15 »

Видимо у тебя массив инициализируется раньше вызова setCodecForTr.

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

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

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

Это заставляет компилятор инициализировать класс (SetCodec) еще до инициализации прочих статических переменных.
Тогда и проблем с кодировками быть не должно.
Записан
radislav72
Гость
« Ответ #5 : Октября 01, 2011, 07:03 »

Видимо у тебя массив инициализируется раньше вызова setCodecForTr.

Точно, как раз в этом и была проблема. Спасибо!
« Последнее редактирование: Октября 01, 2011, 15:06 от radislav72 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Октября 01, 2011, 12:08 »

Видимо у тебя массив инициализируется раньше вызова setCodecForTr.

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

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

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

Это заставляет компилятор инициализировать класс (SetCodec) еще до инициализации прочих статических переменных.
Тогда и проблем с кодировками быть не должно.
Какой офигенно прямой и переносимый код.
Записан
andrew.k
Гость
« Ответ #7 : Октября 01, 2011, 13:27 »

Код
C++ (Qt)
SetCodec __attribute__ ((init_priority (101))) setCodec;
 
Какой офигенно прямой и переносимый код.

А что виндовые компиляторы не понимают атрибутов?
Чем еще он такой непрямой?
Записан
radislav72
Гость
« Ответ #8 : Октября 01, 2011, 15:05 »

Цитировать
Какой офигенно прямой и переносимый код.
А как лучше ?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Октября 02, 2011, 14:45 »

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

Это нестандартно, и никто не обязан это поддерживать. Если gcc использует строгие правила проверки, то и он это не скомпилирует.
Записан
andrew.k
Гость
« Ответ #10 : Октября 02, 2011, 15:00 »

что за строгие правила проверки?
Записан
andrew.k
Гость
« Ответ #11 : Октября 02, 2011, 15:01 »

Так какое решение этой проблемы? Не использовать статически инициализированные данные?
Записан
asvil
Гость
« Ответ #12 : Октября 02, 2011, 15:44 »

хехе, у кого-то хватает силы еще поддерживать все компиляторы, как это делают тролли?
Записан
radislav72
Гость
« Ответ #13 : Октября 05, 2011, 13:53 »

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

я использую, и это нравственно
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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