Вопрос новичка...
От: LaptevVV Россия  
Дата: 14.06.15 11:47
Оценка: 2 (1)
Где почитать, как QLabel на форму вывести на русском?
Когда-то я брал книжку Земскова по Qt 4 — и егошные примеры все прекрасно работали.
Сегодня после долгого перерыва имеем:
— Windows 7
— Qt 5.4.2 — бесплатная
— QtCretor 3.4.1 c MinGW 4.9.1
В Creatore в редакторе установлена по умолчанию кодировка Windows-1251.
Так осталось с давних времен, чтобы не перебивать комментарии.

Делаю простую форму из QDialog.
В main() пишу:
#include "dialog.h"
#include <QApplication>

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

    // -- делаем русскую кодировку --
        QTextCodec *codec = QTextCodec::codecForName("CP1251");
        QTextCodec::setCodecForLocale(codec);                // -- тут в прежней проге стояло setCodecForTr(codec)

        QFont font("Courier", 10, QFont::Bold);
        QApplication::setFont(font);

    Dialog w;
    w.setFont(font);
    w.setWindowTitle(QObject::tr("Поиск перколяционного кластера"));

    w.show();

    return a.exec();
}

Проблема:
а) в неправильной кодировке ?
б) в неправильных вызовах ?
Скорее всего — последнее.
Где прочитать, как правильно?
В Шлее все примеры на английском, а глава о локализации — про глобальные проблемы перевода всех строк в приложении.
Справка в QtCreator — примера подобного не обнаружил.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Вопрос новичка...
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 14.06.15 17:13
Оценка: 3 (3) +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Проблема:

LVV>а) в неправильной кодировке ?
LVV>б) в неправильных вызовах ?

Преобразовать всё, что угодно в Qt не проблема, но это неправильно с точки зрения идеологии кроссплатформенности, которая лежит в основе этой библиотеки. Возьмите любой автоконвертор и массово преобразуйте сразу все файлы проекта или проектов из кодировки CP1251 в UTF8. И в настройках Qt Creator тоже смените кодировку на UTF8.
Re: Вопрос новичка...
От: developer.cpp Россия  
Дата: 14.06.15 20:04
Оценка:
может так
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
Re: Вопрос новичка...
От: Anton Batenev Россия https://github.com/abbat
Дата: 14.06.15 23:01
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV> QTextCodec *codec = QTextCodec::codecForName("CP1251");

LVV> QTextCodec::setCodecForLocale(codec); // -- тут в прежней проге стояло setCodecForTr(codec)

И ведь не зря стояло setCodecForTr...

LVV> Где прочитать, как правильно?


Перекодировать все из кодировки прошлого века в UTF-8. Ну или костылить вида:
QTextCodec::setCodecForLocale + QTextCodec::setCodecForTr + QTextCodec::setCodecForCStrings
Управляю вселенной не привлекая внимания санитаров.
Re: Вопрос новичка...
От: Igore Россия  
Дата: 15.06.15 10:24
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

Присоединяюсь к совету перевести все на utf-8
LVV>Где прочитать, как правильно?
https://wiki.qt.io/Strings_and_encodings_in_Qt
Re[2]: Вопрос новичка...
От: Denwer Россия  
Дата: 16.06.15 08:17
Оценка:
Здравствуйте, velkin, Вы писали:

V>Здравствуйте, LaptevVV, Вы писали:


LVV>>Проблема:

LVV>>а) в неправильной кодировке ?
LVV>>б) в неправильных вызовах ?

V>Преобразовать всё, что угодно в Qt не проблема, но это неправильно с точки зрения идеологии кроссплатформенности, которая лежит в основе этой библиотеки. Возьмите любой автоконвертор и массово преобразуйте сразу все файлы проекта или проектов из кодировки CP1251 в UTF8. И в настройках Qt Creator тоже смените кодировку на UTF8.


И не забыть добавить UTF-8 BOM в файлы, иначе MS VC компилятор будет глючить.
Re[3]: Вопрос новичка...
От: avbochagov Россия  
Дата: 16.06.15 08:20
Оценка:
Здравствуйте, Denwer, Вы писали:

D> V>Здравствуйте, LaptevVV, Вы писали:


D> LVV>>Проблема:

D> LVV>>а) в неправильной кодировке ?
D> LVV>>б) в неправильных вызовах ?

D> V>Преобразовать всё, что угодно в Qt не проблема, но это неправильно с точки зрения идеологии кроссплатформенности, которая лежит в основе этой библиотеки. Возьмите любой автоконвертор и массово преобразуйте сразу все файлы проекта или проектов из кодировки CP1251 в UTF8. И в настройках Qt Creator тоже смените кодировку на UTF8.


D> И не забыть добавить UTF-8 BOM в файлы, иначе MS VC компилятор будет глючить.


А какие глюки? Как проявляются?

Я просто, наооборот, всегда выкидываю BOM...
avalon/1.0.442
Re[4]: Вопрос новичка...
От: Denwer Россия  
Дата: 16.06.15 10:19
Оценка:
Здравствуйте, avbochagov, Вы писали:

D>> И не забыть добавить UTF-8 BOM в файлы, иначе MS VC компилятор будет глючить.


A>А какие глюки? Как проявляются?


A>Я просто, наооборот, всегда выкидываю BOM...


Не может автоматом распознать что файл действительно UTF-8, со всеми вытекающими.
Re[2]: Вопрос новичка...
От: LaptevVV Россия  
Дата: 16.06.15 15:21
Оценка:
LVV>> QTextCodec *codec = QTextCodec::codecForName("CP1251");
LVV>> QTextCodec::setCodecForLocale(codec); // -- тут в прежней проге стояло setCodecForTr(codec)
AB>И ведь не зря стояло setCodecForTr...
Для прежних версий — не зря. А для новой — пишет ошибку компиляции, что данный метод не является членом класса QTextCodec.
Дальше я просто не полез копаться.
LVV>> Где прочитать, как правильно?
AB>Перекодировать все из кодировки прошлого века в UTF-8. Ну или костылить вида:
AB>QTextCodec::setCodecForLocale + QTextCodec::setCodecForTr + QTextCodec::setCodecForCStrings
Я внял вашему совету и все перекодировал.
Установка кодека в результате просто не понадобились
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Вопрос новичка...
От: LaptevVV Россия  
Дата: 16.06.15 15:21
Оценка:
Здравствуйте, developer.cpp, Вы писали:

DC>может так

DC>
DC>QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
DC>

Я просто перекодировал файлы в Notepad2.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Вопрос новичка...
От: LaptevVV Россия  
Дата: 16.06.15 15:22
Оценка:
V>Преобразовать всё, что угодно в Qt не проблема, но это неправильно с точки зрения идеологии кроссплатформенности, которая лежит в основе этой библиотеки. Возьмите любой автоконвертор и массово преобразуйте сразу все файлы проекта или проектов из кодировки CP1251 в UTF8. И в настройках Qt Creator тоже смените кодировку на UTF8.
Я так и сделал — спасибо.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Вопрос новичка...
От: LaptevVV Россия  
Дата: 16.06.15 15:27
Оценка:
D>И не забыть добавить UTF-8 BOM в файлы, иначе MS VC компилятор будет глючить.
Креэйтор автоматом сам вставляет.
И компилирую я не студийным компилятором, и мингвшным.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Вопрос новичка...
От: HolyNick  
Дата: 19.06.15 12:23
Оценка: 1 (1)
Я делаю так:
  w.setWindowTitle(QStringLiteral("Поиск перколяционного кластера"));

PS: Для QLabel аналогично.
Отредактировано 19.06.2015 12:24 HolyNick . Предыдущая версия .
Re: Вопрос новичка...
От: SaZ  
Дата: 23.06.15 08:48
Оценка: 17 (2)
Здравствуйте, LaptevVV, Вы писали:

LVV>Где почитать, как QLabel на форму вывести на русском?


LVV>В main() пишу:

LVV>
LVV>    w.setWindowTitle(QObject::tr("HERE YOU SHOULD USE ONLY ASCII <= 127"));
LVV>

LVV>Проблема:
LVV>б) в неправильных вызовах ?
LVV>Скорее всего — последнее.

Обычно все строки внутри приложения (даже если вы не реализовываете поддержку нескольких языков) пишутся на английском. Причём можно на техническом. Далее, собирается файл локализации и подключается к приложению. Файл можно зашить в ресурсы.

Лично я, как правило, делаю два перевода:
Eng -> Ru  // что понятно
Eng -> Eng // что позволяет лингвистам делать корректные тексты, без ковыряния в исходниках


LVV>Где прочитать, как правильно?

LVV>...

http://doc.qt.io/qt-5/qtlinguist-index.html
http://doc.qt.io/qt-5/internationalization.html
http://doc.qt.io/qt-5/qtranslator.html

Кратко:
1) lupdate пробегается по проекту и генерирует специальные xml файлы, которые умеет принимать linguist
2) linguist сохраняет перевод в виде "скомпилированного" файла, в qt-шном формате (.qm)
3) .qm файл можно зашить в ресурсы
4) В приложении, через QTranslator, грузим "скомпилированную" локализацию.
Re[2]: Вопрос новичка...
От: LaptevVV Россия  
Дата: 23.06.15 16:21
Оценка:
SaZ>Обычно все строки внутри приложения (даже если вы не реализовываете поддержку нескольких языков) пишутся на английском. Причём можно на техническом. Далее, собирается файл локализации и подключается к приложению. Файл можно зашить в ресурсы.

SaZ>Лично я, как правило, делаю два перевода:

SaZ>
SaZ>Eng -> Ru  // что понятно
SaZ>Eng -> Eng // что позволяет лингвистам делать корректные тексты, без ковыряния в исходниках
SaZ>

Спасибо. У меня проще — прога нужна только здесь на местном уровне.
Поэтому "тяжелую артиллерию" привлекать не хотелось.
SaZ>http://doc.qt.io/qt-5/qtlinguist-index.html
SaZ>http://doc.qt.io/qt-5/internationalization.html
SaZ>http://doc.qt.io/qt-5/qtranslator.html
Спасибо.
SaZ>Кратко:
SaZ>1) lupdate пробегается по проекту и генерирует специальные xml файлы, которые умеет принимать linguist
SaZ>2) linguist сохраняет перевод в виде "скомпилированного" файла, в qt-шном формате (.qm)
SaZ>3) .qm файл можно зашить в ресурсы
SaZ>4) В приложении, через QTranslator, грузим "скомпилированную" локализацию.
Спасибо.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Ненавижу Windows-1251
От: omgOnoz  
Дата: 25.06.15 13:18
Оценка:
Здравствуйте, LaptevVV, Вы писали:

  Скрытый текст
LVV>Где почитать, как QLabel на форму вывести на русском?
LVV>Когда-то я брал книжку Земскова по Qt 4 — и егошные примеры все прекрасно работали.
LVV>Сегодня после долгого перерыва имеем:
LVV>- Windows 7
LVV>- Qt 5.4.2 — бесплатная
LVV>- QtCretor 3.4.1 c MinGW 4.9.1
LVV>В Creatore в редакторе установлена по умолчанию кодировка Windows-1251.
LVV>Так осталось с давних времен, чтобы не перебивать комментарии.

LVV>Делаю простую форму из QDialog.

LVV>В main() пишу:
LVV>
LVV>#include "dialog.h"
LVV>#include <QApplication>

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

LVV>    // -- делаем русскую кодировку --
LVV>        QTextCodec *codec = QTextCodec::codecForName("CP1251");
LVV>        QTextCodec::setCodecForLocale(codec);                // -- тут в прежней проге стояло setCodecForTr(codec)

LVV>        QFont font("Courier", 10, QFont::Bold);
LVV>        QApplication::setFont(font);

LVV>    Dialog w;
LVV>    w.setFont(font);
LVV>    w.setWindowTitle(QObject::tr("Поиск перколяционного кластера"));

LVV>    w.show();

LVV>    return a.exec();
LVV>}
LVV>

LVV>Проблема:
LVV>а) в неправильной кодировке ?
LVV>б) в неправильных вызовах ?
LVV>Скорее всего — последнее.
LVV>Где прочитать, как правильно?
LVV>В Шлее все примеры на английском, а глава о локализации — про глобальные проблемы перевода всех строк в приложении.
LVV>Справка в QtCreator — примера подобного не обнаружил.


Во первых используйте нормальную кодировку UTF-8!

Виндовые кодировки должны умереть! На английской Венде вечный трах в мозг с 1251 — нормального способа эту проблему решить нет!

Если текст вшит в программу — то все пропало, если внешние файлы — спасает перекодеровка текста в UTF-8.

Возможны также проблемы с фонтами.
Отредактировано 25.06.2015 13:24 omgOnoz . Предыдущая версия . Еще …
Отредактировано 25.06.2015 13:23 omgOnoz . Предыдущая версия .
Re: Ненавижу Windows-1251
От: LaptevVV Россия  
Дата: 25.06.15 13:51
Оценка: +1
Здравствуйте, omgOnoz, Вы писали:

O>Во первых используйте нормальную кодировку UTF-8!

O>Виндовые кодировки должны умереть! На английской Венде вечный трах в мозг с 1251 — нормального способа эту проблему решить нет!
O>Если текст вшит в программу — то все пропало, если внешние файлы — спасает перекодеровка текста в UTF-8.
O>Возможны также проблемы с фонтами.
Спасибо.
Как я тут уже писал — просто перегнал весь код в UTF-8.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: на самом деле всё не так
От: S-SH Россия http://shmakov.ru/
Дата: 24.06.16 12:09
Оценка:
Здравствуйте, Denwer, Вы писали:
D>И не забыть добавить UTF-8 BOM в файлы, иначе MS VC компилятор будет глючить.

И не забыть убрать UTF-8 BOM, иначе MS VC компилятор будет глючить.

Обоснование следующее:
1. По умолчанию, т.е. если BOM нет, MS VC считает что кодировка файла исходника виндовая
А если BOM есть, то кодировка файла UTF-8
2. Для основного кода это без разницы, т.к. латиница кодируется одинаково в UTF-8 и Windows-1251
3. Но для строк "кириллицей"...
Если MS VC думает, что кодировка файла Win-1251, то он считает, что символы в строке написаны уже в верной кодировке, и записывает их в код как есть. Поэтому русские буквы, записанные в исходнике двухбайтовыми символами UTF-8 попадут в код так же двумя байтами.

Но если MS VC думает, что кодировка файла UTF-8, то он во время компиляции переводит символы в строке в кодировку Windows-1251.
И тогда русские буквы, записанные в исходнике двухбайтовыми символами UTF-8 попадут в код одним байтом в кодировке Windows-1251. Но Qt об этом не знает (если специально ему не сказать).
И тогда в QString string = "русский текст"; будут записаны крокозябры.

За рамками остались u8"", которых нет в старых VC
IMHO. смайлики добавить по вкусу.
Re[4]: на самом деле всё не так
От: Denwer Россия  
Дата: 10.07.16 18:37
Оценка: 4 (1)
Здравствуйте, S-SH, Вы писали:

SS>И тогда в QString string = "русский текст"; будут записаны крокозябры.


Просто строковые константы нужно использовать как положено:

QString string = QStringLiteral("русский текст");
Re[5]: на самом деле всё не так
От: SaZ  
Дата: 11.07.16 07:22
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Просто строковые константы нужно использовать как положено:

D>QString string = QStringLiteral("русский текст");

QStringLiteral — это лямбда, который позволяет избежать вызова конструктора QString с сопутствующими конвертациями каждый раз, при создании переменной. Никакого отношения к кодировке исходников она не имеет.

P.S. Хватит некрофилить, товарищи.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.