Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: IGHOR от Ноябрь 22, 2007, 00:35



Название: Unicode в drawText
Отправлено: IGHOR от Ноябрь 22, 2007, 00:35
QPainter painter(&Picture);
painter.drawText(10,10,"Вывожу текст русскими");

И после этого на картинке не правильно отображается кодировка.
При выводе английских букв все ок.
Как правилльно выводить текст на картинку Picture ?
Спасибо.


Название: Re: Unicode в drawText
Отправлено: pastor от Ноябрь 22, 2007, 00:40
Посмотрите функции


void QTextCodec::setCodecForCStrings ( QTextCodec * codec )
void QTextCodec::setCodecForLocale ( QTextCodec * c )
void QTextCodec::setCodecForTr ( QTextCodec * c )

и выставите нужную кодировку


Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 22, 2007, 01:09
Разобрался, спасибо.

QString str;
QTextCodec::codecForLocale()->toUnicode(str);


Название: Re: Unicode в drawText
Отправлено: pastor от Ноябрь 22, 2007, 01:32
Я имелл ввиду что-то типа этого

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));

попробуёте должно работать.


Название: Re: Unicode в drawText
Отправлено: ритт от Ноябрь 22, 2007, 08:25
QTextCodec::codecForLocale()->toUnicode(str); - не самый верный подход
ты ж не браузер пишешь (наверняка) - зачем смешивать разные кодеки/локали?
установи локаль, котоорую собираешься использовать, один раз глобально - и всё...

я делаю так:
Код:
int main(int argc, char** argv)
{
#ifdef OVERRIDE_CODEC
QString codecName = QString(OVERRIDE_CODEC);
if(!codecName.isEmpty())
QTextCodec::setCodecForLocale(QTextCodec::codecForName(codecName));
#endif
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());

QApplication app(argc, argv);
[code]
[/code]


Название: Re: Unicode в drawText
Отправлено: Alex03 от Ноябрь 22, 2007, 13:46
А что
1. "тролевый правильный подход" tr("English text") и *.ts *.qm чё никто не пользует?
2. trUtf8("текст хоть на 5-ти языках"), исходники в UTF8.
никто не пользует?

Я пока пользую первый, но смотрю на второй. Ибо текущие проекты локализовывать пока не предвидится, да и не факт что английский язык "главнее" русского. :)


Название: Re: Unicode в drawText
Отправлено: Вячеслав от Ноябрь 22, 2007, 14:02
я юзаю только первый по причине использования проектов в форточках\линуксе\мсвс - и думать о кодировках - ну нах :( А trUtf8 - надо будет подумать ;)


Название: Re: Unicode в drawText
Отправлено: ритт от Ноябрь 22, 2007, 16:39
имеется в виду, что painter.drawText(10,10,tr("my russian text")) решит проблему?


Название: Re: Unicode в drawText
Отправлено: Hellraiser от Ноябрь 22, 2007, 17:06
имеется в виду, что painter.drawText(10,10,tr("my russian text")) решит проблему?
Если написать в программе именно так, перевести, подгрузить перевод - то конечно решит. Вся проблема то у многих именно из-за Юникода. Кутя работает исключительно в нем (если конечно очень ее не попросить  :) ), а строки народ пишет как-попало. Приведенный выше вариант с кодеками и есть как раз случай обмана/упрашивания Кути.


Название: Re: Unicode в drawText
Отправлено: ритт от Ноябрь 22, 2007, 18:50
хэллрайзер,
такое упрашивание приходится использовать, чтобы из лога читался _текст_, а не козюльки с разными кодировками

на самом деле для меня в этом коде по-настоящему важна только строка
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
т.к. codecForCStrings по умолчанию выставляется в латин1
а если уж при сборке был форсирован какой-то другой кодек, то имеет смысл проставить его и для тр'ок

везде использую "тролевый правильный подход" tr("English text")
trUtf8 не использую нигде, т.к. с кодом выше при сборке можно форсировать ютф-8 кодек и получить тот же эффект

так что, это не обманывание/упрашивание, а фича :)


Название: Re: Unicode в drawText
Отправлено: Hellraiser от Ноябрь 22, 2007, 18:54
Да я и сам так делаю...  ;)


Название: Re: Unicode в drawText
Отправлено: Swappp от Ноябрь 22, 2007, 20:43
А не проще ли исходники хранить в UTF-8? ИМХО второй по правильности вариант, после tr(), для случаев, когда в принципе нужен только один язык.


Название: Re: Unicode в drawText
Отправлено: ритт от Ноябрь 22, 2007, 21:10
когда у тебя несколько программистов, у каждого своя любимая среда разработки/ос и т.д., охреительное занятие потом искать какой сырец был сохранён в цп1251 :)
и сырцы весят вдвое больше...
и кому это вообще надо - следить за кодирровкой в сорцах?

а когда _в принципе_ нужен только один язык, всё-равно надо пользоваться тр() - вот!


Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 22, 2007, 21:17
когда делаю tr("русский текст") всеравно кодировка кривая..
Меня вариант
QString str;
QTextCodec::codecForLocale()->toUnicode(str);
Полностью устраивает..


Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 22, 2007, 21:28
Я имелл ввиду что-то типа этого

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));

попробуёте должно работать.

Это не работает.. всеравно каракули.

QTextCodec::codecForLocale()->toUnicode(str); - не самый верный подход
ты ж не браузер пишешь (наверняка) - зачем смешивать разные кодеки/локали?
установи локаль, котоорую собираешься использовать, один раз глобально - и всё...
А почему этот вариант плохой ? глюки могут быть ?


Название: Re: Unicode в drawText
Отправлено: pastor от Ноябрь 22, 2007, 21:49
Это не работает.. всеравно каракули.

Полный код в студию. У меня работает все прекрасно!

BWT: какая ось?


Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 22, 2007, 21:53
Это не работает.. всеравно каракули.

Полный код в студию. У меня работает все прекрасно!

BWT: какая ось?

Ось линух, код на другом компе, на данный момент передать его нечем.
Я написал это QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
в срр класа главного окна, в каком и рисую текст.
Может в другом месте нужно писать ?


Название: Re: Unicode в drawText
Отправлено: Вячеслав от Ноябрь 22, 2007, 21:57
когда делаю tr("русский текст") всеравно кодировка кривая..
Меня вариант
QString str;
QTextCodec::codecForLocale()->toUnicode(str);
Полностью устраивает..
так и должно быть (про кодировку) tr подставляет строку из внешнего qm файла ;)
Тебе-же показали

QTrnaslator *trans=new QTranslator;
trans->load("my_app_ru.qm");
qApp->installTranslator(trans);
QString ru=tr("en");

Ы ? и посмотреть на lupdate/lrelease/linguist'а
и IMHO динамический codecForLocale() неверен - исходник-то в одной кодировке .... А если локаль будет другая ? Вариант xep'а лучшее ;)


Название: Re: Unicode в drawText
Отправлено: pastor от Ноябрь 22, 2007, 21:58
Ось линух, код на другом компе, на данный момент передать его нечем.
Я написал это QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
в срр класа главного окна, в каком и рисую текст.
Может в другом месте нужно писать ?

Попробуй написать QTextCodec::codecForName("utf8"); вместо QTextCodec::codecForName("Windows-1251") - это я указал например


Название: Re: Unicode в drawText
Отправлено: Вячеслав от Ноябрь 22, 2007, 21:58
Это не работает.. всеравно каракули.

Полный код в студию. У меня работает все прекрасно!

BWT: какая ось?

Ось линух, код на другом компе, на данный момент передать его нечем.
Я написал это QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
в срр класа главного окна, в каком и рисую текст.
Может в другом месте нужно писать ?
А ты уверен что у тебя в линуксе 1251 ?! Там обычно Utf8 или KOI8-r ....


Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 22, 2007, 22:06
Ось линух, код на другом компе, на данный момент передать его нечем.
Я написал это QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
в срр класа главного окна, в каком и рисую текст.
Может в другом месте нужно писать ?

Попробуй написать QTextCodec::codecForName("utf8"); вместо QTextCodec::codecForName("Windows-1251") - это я указал например

Да, так QTextCodec::codecForName("utf8") работает, Спасибо, так действительно удобнее


Название: Re: Unicode в drawText
Отправлено: Swappp от Ноябрь 22, 2007, 22:13
когда у тебя несколько программистов, у каждого своя любимая среда разработки/ос и т.д., охреительное занятие потом искать какой сырец был сохранён в цп1251 :)
Ну это можно и нужно решать административными методами :) тем более сейчас любая современная среда и редактор поддерживают UTF-8. А комментарии все наверно тоже исключительно на английском пишут?
Цитировать
и сырцы весят вдвое больше...
Правда? В UTF-8 все символы <=127 кодируются одним байтом. В два раза больше исходники будут весить в случае, если они полностью написаны на русском, без использования знаков препинания, цифр, пробелов и т.п. :) либо если используется много символов с кодом >2047, но это уже не кириллица.
Цитировать
и кому это вообще надо - следить за кодирровкой в сорцах?
Следить не надо, ведь есть внутренние соглашения, по стилю кодинга и т.п. (или каждый лепит код кто во что горазд? а потом, в случае ухода кого то из команды, при необходимости внести изменения в написаный им код, его переписывают с нуля?), так вот это всего лишь еще один пункт в нем.
Цитировать
а когда _в принципе_ нужен только один язык, всё-равно надо пользоваться тр() - вот!
Зачем?
p.s. сам всегда пишу с tr() :)


Название: Re: Unicode в drawText
Отправлено: Alex03 от Ноябрь 23, 2007, 07:36
Swappp +1


Всем кто чтото не понимает в кодировках в Qt читать документик QTDIR/doc/html/i18n.html



Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 24, 2007, 02:40
Всем Спасибо!


Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 26, 2007, 07:21
Всем Опять Привет!
Теперь я читаю базу данных MYSQL
достаю оттуда масив QString"ов и ллю на форму в textDraw
и русские символы не отображаются.. одни знаки ??????????????
И перепробовал базу сохранять в всех кодировках..
и QTextCodec настраивал, ничего не выходит
Как выправить такое ?


Название: Re: Unicode в drawText
Отправлено: Вячеслав от Ноябрь 26, 2007, 09:24
Всем Опять Привет!
Теперь я читаю базу данных MYSQL
достаю оттуда масив QString"ов и ллю на форму в textDraw
и русские символы не отображаются.. одни знаки ??????????????
И перепробовал базу сохранять в всех кодировках..
и QTextCodec настраивал, ничего не выходит
Как выправить такое ?
поиск рулит по форуму http://prog.org.ru/forum/index.php/topic,4344.0.html (http://prog.org.ru/forum/index.php/topic,4344.0.html)


Название: Re: Unicode в drawText
Отправлено: IGHOR от Ноябрь 27, 2007, 19:03
Всем СПАСИБО за помощь. Все разобрался.
Удачи Всем!!


Название: Re: Unicode в drawText
Отправлено: Cyrax от Декабрь 18, 2007, 18:04
Что-то не понятно совсем.
Все кодировки базы данных MySQL 5 настроены на cp1251 - кодировка БД по умолчанию, кодировки таблиц, полей. В базу данных заносится информация на русском языке, например, слово "Монитор".
Далее я в php-скрипте выполняю команды:
Цитировать
mysql_query ("set names 'cp1251'");
mysql_query ("set collation_connection='cp1251_general_ci'");
После чего получаю нормальный русский текст, который вывожу на web-страницу.

теперь то же самое делаю в Qt-программе с той же самой БД, с той же таблицей и записью:
Цитировать
QSqlQuery q1("set names 'cp1251'");
bool t = q1.exec();  // возвращает true
QSqlQuery q2("set collation_connection='cp1251_general_ci'");
t = q2.exec();  // возвращает true
   
QSqlQuery query("SELECT * FROM article");
t = query.exec();    // возвращает true
query.first();
QSqlRecord rec = query.record();   
QString txt = rec.value("fullName").toString();
   
dep.setWindowTitle(txt);

В результате получаю в заголовке козяблики (но не вопросительные знаки). Все 3 запроса выполняются нормально (exec() возвращает true).
Предварительно устанавливаю:
Цитировать
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

Если в последней строке фрагмента кода txt перегнать в latin1:
Цитировать
dep.setWindowTitle(txt.toLatin1());
то получаю то, что нужно: "Монитор".

Если убрать установку кодеков в Windows-1251, то в случае с "dep.setWindowTitle(txt.toLatin1())" получаю те же козяблики, что с установкой кодеков, но без перегона в Latin1.

Если запросы, устанавливающие русскую кодировку для соединения, убрать, то в обоих случаях ("dep.setWindowTitle(txt);" и "dep.setWindowTitle(txt.toLatin1());" получаю 7 вопросительных знаков...

Вот получает объект QSqlQuery от сервера 7 байтов в кодировке cp1251. Далее через QVariant загоняю их в QString. При этом он "знает", что получил байты в cp1251, поскольку кодеки настроены на cp1251. Тем не менее, получаю что-то, что приходитося перегонять в Latin1 для того, чтобы получить cp1251...


Название: Re: Unicode в drawText
Отправлено: Вячеслав от Декабрь 18, 2007, 18:35
РРРРРРРРР !!!!!!!!!!!!
QVAriant работает в данном случае с QString'om
QStirng - это _всегда_ юникод без всяких "помнит о кодеке"
Поидее heuristicCodec в mysql драйвере (плагине) _должен_ из 1251 сделать юникод , если нет - то можно 1) попробывать вытащить _какой_ кодек он (плагин) использует и допинать его в нужном направлении
2) почитать ссылку 3 постами выше
Ы ?


Название: Re: Unicode в drawText
Отправлено: Cyrax от Декабрь 18, 2007, 19:13
Цитировать
Поидее heuristicCodec в mysql драйвере (плагине) _должен_
Должен - не должен, но почему-то заплатки ставить приходится. В src\sql\drivers\mysql\qsql_mysql.cpp заменил
Цитировать
QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql))
на
Цитировать
QTextCodec* heuristicCodec = QTextCodec::codecForName("Windows-1251");
Пересобрал, теперь получаю русский текст без toLatin1()...

Меня такой вопрос интересует. В своём предыдущем посте я привёл фрагмент кода. Где там у меня ошибка, приводящая к проблеме с русской кодировкой ?