![]() |
|
|
![]()
|
|
| tumanovalex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 3.1.2005 Репутация: нет Всего: нет |
Пытаюсь создать консольное приложение:
1. Как правильно настроить вывод русских букв в консоле (при выводе qDebug вместо русских букв знаки вопросов)? 2. Почему не выводится текст в строке out << "Русский текст" << '\n'; 3. Есть ли аналог в QT функции _getch()? 4. Можно ли настроить Qcreator так, чтобы при выделении блока можно было его закоментировать по нажатию кнопки (как в Visual Studio) или по горячей клавише? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
пробовал так ?
QTextCodec *cyrillicCodec = QTextCodec::codecForName( "Windows-1251" ); -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Это не правильный код. Мало того, что он не будет корректно работать на других ОС отличных от Windows, так тут еще в одну кашу смешаваются кодировки файла и локали операционной системы. Поэтому обязательно используй проверку ОС:
В Windows локаль по умолчанию cp1251 (для русскоязычного населения, для Украины уже другая будет). Однако кодировка в виндовой консоли "IBM 866" (cp866) (опять же для американцев codepage будет другой). Прописывая кодировки мы автоматически говорим, что приложение пишется для определенной категории людей, наций. Это не правильно. Исходники должны быть написаны либо в UTF-8 кодировке, либо чистый ASCII (Latin-1), где используются только английские символы. Теперь: QTextCodec::setCodecForCStrings - по сути задается кодировка в которой написан файл исходника, но используется и для перевода строк char* полученных из других источников. QTextCodec::setCodecForLocale - специфично для ОС. Может отличаться от codecForCStrings() и в случае с виндой быть не корректным для вывода в консоль русского текста. QTextStream внутри себя использует codecForLocale() qDebug() внутри себя используется QTextStream и как следствие использует codecForLocale() Что получается в итоге. Для Windows, для русских codecForLocale() имеет кодировку windows-cp1251, в то время как кодировка консоли IBM 866 (cp866). Отсюда мы получаем крякозябры. Жестко менять кодировку через setCodecForLocale не корректно. Стало быть для QTextStream можно использовать установку своего кодека через метод setCodec(), поставить "IBM 866", а для qDebug() видимо остается использовать QString::fromLocal8Bit(), так как кодировку у этого класса поменять нельзя. Или выставлять setCodecForLocale() временно перед выводом сообщения, а после вывода возвращать обратно. Это сообщение отредактировал(а) SABROG - 29.7.2010, 10:43 |
|||
|
||||
| tumanovalex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 3.1.2005 Репутация: нет Всего: нет |
Я сделал так:
1. В настройках QCreator я установил в кодировке файла по умолчанию UTF8. 2. Перекодировал Штирлицем файл и поправил. Правильный вывод получился при таком коде:
|
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Еще бы, у тебя ведь кодировка исходника теперь отличается от кодировки локали. Вот как надо:
Обратите внимание, что в случае с QTextStream нужно обязательно указывать конструктор QString(). И забудьте про всякие tr() для перекодировки из одной в другую, это бред какой-то. Это сообщение отредактировал(а) SABROG - 30.7.2010, 09:32 |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
SABROG, codecForLocale() под Windows у консольного приложения разве по умолчанию не "IBM 8xx"? Может имеет смысл получать информацию из реестра о текущей OEM кодировке?
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |