Russian Qt Forum
Ноябрь 22, 2024, 20:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Русский текст в консольном QT приложении  (Прочитано 20668 раз)
fear
Гость
« : Май 18, 2006, 18:27 »

Проблема состоит в выводе русского текста в консольном приложении.
Пробовал два варианта:

Код:
QTextCodec *codec = QTextCodec::codecForName("utf8"); 

QTextStream out(stdout);
out.setCodec(codec);
 
out<<"Привет"<<endl;


Выводит: НепонимающийНепонимающий


Код:
QTextCodec *codec = QTextCodec::codecForName("utf8"); 
QTextCodec::setCodecForTr(codec);

QTextStream out(stdout);
out.setCodec(codec);
 
out<<QString(QObject::tr("Привет"))<<endl;


Выводит совсем какую то тарабаршину
Записан
Asaphus_Expansus
Гость
« Ответ #1 : Май 18, 2006, 20:11 »

QTextCodec *codec = QTextCodec::codecForName("utf8");
   QTextCodec::setCodecForCStrings(codec);
   QTextStream out(stdout);
   out << QString("Привет") <<endl;
Записан
Steven_Orko
Гость
« Ответ #2 : Май 18, 2006, 20:46 »

Если ты в винде, то надо использовать кодек "IBM 866", а не utf8. В Линуксе тот, что в локали выставлен...
Записан
fear
Гость
« Ответ #3 : Май 18, 2006, 23:53 »

Оба варианта пробовал, результат прежний.
Пишу в Windows. В диалоговом приложении пробовал использовать кодек utf8 - русский отображается.
Записан
DenKor
Гость
« Ответ #4 : Май 19, 2006, 07:15 »

QTextCodec *codec = QTextCodec::codecForName("IBM 866");

QTextStream out(stdout);
out.setCodec(codec);
 
out<<"Привет"<<endl;

добавлено спустя 2 минуты:

 
Цитата: "DenKor"
QTextCodec *codec = QTextCodec::codecForName("IBM 866");

QTextStream out(stdout);
out.setCodec(codec);
 
out<<"Привет"<<endl;


P.s. И в досовском окне по умолчанию должны быть загружены руские шрифты
Записан
fear
Гость
« Ответ #5 : Май 20, 2006, 11:30 »

Цитата: "DenKor"
P.s. И в досовском окне по умолчанию должны быть загружены руские шрифты

Программа должна работать без головной боли для пользователя

В  MFC была функция CharToOem(), в QT, я думаю, должен быть подобный механизм.

Код:
char result[128];

CharToOemA("Привет", result);
cout<<result<<endl;


Выводит:
Привет
Записан
Steven_Orko
Гость
« Ответ #6 : Май 20, 2006, 13:27 »

Ща расскажу, почему у тебя не получается. Ты когда пишешь в тексте программы строку по-русски, то она у тебя хранится в кодировке винды, то есть в Windows-1251. Что будет, если ты ее сразу станешь конвертить в IBM 866? Ничего хорошего, так как код символов точно не совпадет. Хочешь универсальности, никогда не пиши в тексте проги сообщения по-русски. Если уж так надо, то выдели отдельный хедер, где все они будут объявлены, как #define. Например, так:
Код:


QString convertStrToUnicode(QString text);

#define strMyMsg  convertStrToUnicode("Это мое соощение")
#define ...



А дальше уже из UNICODE можешь конверить, куда хошь, так в ту еж IBM 866.
Кстати, только в этом случае ты увидишь в консоли русские буквы. Проверял на себе, прям щас, прежде, чем пост отправил )))
Записан
fear
Гость
« Ответ #7 : Май 20, 2006, 16:22 »

Цитата: "Steven_Orko"
Ща расскажу, почему у тебя не получается. Ты когда пишешь в тексте программы строку по-русски, то она у тебя хранится в кодировке винды, то есть в Windows-1251. Что будет, если ты ее сразу станешь конвертить в IBM 866? Ничего хорошего, так как код символов точно не совпадет.


Почему тогда дилоговое QT приложение, работает изумительно? В текте программы я как раз по русски пишу.

Код:
#include <QtGui/QApplication>
#include <QTextCodec>
#include <QPushButton>

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

    QTextCodec *codec = QTextCodec::codecForName("utf8");
    QTextCodec::setCodecForTr(codec);

    QPushButton button(QPushButton::tr("Привет чувак ..."));
    button.show();

    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
 
    return app.exec();
}
Записан
Steven_Orko
Гость
« Ответ #8 : Май 20, 2006, 18:55 »

А потому, что консоль - это одно, а GUI - это другое. Gui-приложение в Винде использует по-умолчанию кодировку Windows-1251, ну, или utf8, без разницы. А вот консоль использует как раз OEM, т.е. IBM 866. Если ты помнишь те времена, когда господствовал MS-DOS 6.22, то наверняка щас вспомнишь, как в конфигурационных файлах autoexec.bat писали что-то связанное с этим словом.

добавлено спустя 3 минуты:

 Да, кстати, чтобы приложение использовало UNICODE в Винде, надо его скомпилировать с каким-то флагом... Не помню, не делал такого...
Записан
fear
Гость
« Ответ #9 : Май 21, 2006, 11:11 »

Цитата: "Steven_Orko"
Ты когда пишешь в тексте программы строку по-русски, то она у тебя хранится в кодировке винды, то есть в Windows-1251. Что будет, если ты ее сразу станешь конвертить в IBM 866? Ничего хорошего, так как код символов точно не совпадет.


Почему тогда при конвертации русских строк в консольном приложении функцией CharToOem() (она получается выполняет конвертацию из Windows-1251 в IBM 866) конвертация проходит корректно? Не верится что в QT нет подобной функции.
Записан
Ka3a4oK
Гость
« Ответ #10 : Май 21, 2006, 18:38 »

Попробуй в самом начале функции main написать:

Код:
setlocale(LC_CTYPE, "Russian");
Записан
Steven_Orko
Гость
« Ответ #11 : Май 21, 2006, 23:59 »

Цитата: "fear"

Почему тогда при конвертации русских строк в консольном приложении функцией CharToOem() (она получается выполняет конвертацию из Windows-1251 в IBM 866) конвертация проходит корректно?

Знаешь что? Ты бы сразу сказал, что с программирование дружишь не долго. Тебе твой вопрос про корректность не кажется глупым? Если нет, то отвечаю: люди знаю, что делают, когда писали эту функцию.

Цитата: "fear"

Не верится что в QT нет подобной функции.

Эт почему ж?Непонимающий Очень даже верится. Есть механизм, который позволяет переводить строки из одной кодировки в другую. Или по-твоему надо было написать куеву тучу всяких разных функций для перевода из одной кодировки в другую? Ты преставляешь себе их количество и гибкость такого решения?
ИМХО, то, что вместо этого сделали тролли, гораздо лучший и более гибкий вариант.
Записан
fear
Гость
« Ответ #12 : Май 23, 2006, 23:30 »

Цитата: "Steven_Orko"
Ты когда пишешь в тексте программы строку по-русски, то она у тебя хранится в кодировке винды, то есть в Windows-1251.


Возникает вопрос (случай для GUI QT приложения):
Если строка, которую пишешь в коде по-русски хранится в Windows-1251, то почему для коректного отображения русского языка приходится устанавливать кодек utf8? Т.е. если я тебя правильно понял, по-умолчанию строки сохраняются в Windows-1251 кодировке, а для их отображения по-умолчанию используется какая то другая кодировка? Вопрос, в чём логика такого подхода?
Записан
Steven_Orko
Гость
« Ответ #13 : Май 23, 2006, 23:50 »

Потому, что, как я понял, Qt для отображения использует UNICODE в GUI.
Записан
omorozov
Гость
« Ответ #14 : Август 15, 2014, 15:17 »

Попробуй в самом начале функции main написать:

Код:
setlocale(LC_CTYPE, "Russian");
Вот это работает, спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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