Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: fear от Май 18, 2006, 18:27



Название: Русский текст в консольном QT приложении
Отправлено: 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;


Выводит совсем какую то тарабаршину


Название: Русский текст в консольном QT приложении
Отправлено: Asaphus_Expansus от Май 18, 2006, 20:11
QTextCodec *codec = QTextCodec::codecForName("utf8");
   QTextCodec::setCodecForCStrings(codec);
   QTextStream out(stdout);
   out << QString("Привет") <<endl;


Название: Русский текст в консольном QT приложении
Отправлено: Steven_Orko от Май 18, 2006, 20:46
Если ты в винде, то надо использовать кодек "IBM 866", а не utf8. В Линуксе тот, что в локали выставлен...


Название: Русский текст в консольном QT приложении
Отправлено: fear от Май 18, 2006, 23:53
Оба варианта пробовал, результат прежний.
Пишу в Windows. В диалоговом приложении пробовал использовать кодек utf8 - русский отображается.


Название: Русский текст в консольном QT приложении
Отправлено: DenKor от Май 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. И в досовском окне по умолчанию должны быть загружены руские шрифты


Название: Русский текст в консольном QT приложении
Отправлено: fear от Май 20, 2006, 11:30
Цитата: "DenKor"
P.s. И в досовском окне по умолчанию должны быть загружены руские шрифты

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

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

Код:
char result[128];

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


Выводит:
Привет


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


QString convertStrToUnicode(QString text);

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



А дальше уже из UNICODE можешь конверить, куда хошь, так в ту еж IBM 866.
Кстати, только в этом случае ты увидишь в консоли русские буквы. Проверял на себе, прям щас, прежде, чем пост отправил )))


Название: Русский текст в консольном QT приложении
Отправлено: fear от Май 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();
}


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

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

 Да, кстати, чтобы приложение использовало UNICODE в Винде, надо его скомпилировать с каким-то флагом... Не помню, не делал такого...


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


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


Название: Русский текст в консольном QT приложении
Отправлено: Ka3a4oK от Май 21, 2006, 18:38
Попробуй в самом начале функции main написать:

Код:
setlocale(LC_CTYPE, "Russian");


Название: Русский текст в консольном QT приложении
Отправлено: Steven_Orko от Май 21, 2006, 23:59
Цитата: "fear"

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

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

Цитата: "fear"

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

Эт почему ж???? Очень даже верится. Есть механизм, который позволяет переводить строки из одной кодировки в другую. Или по-твоему надо было написать куеву тучу всяких разных функций для перевода из одной кодировки в другую? Ты преставляешь себе их количество и гибкость такого решения?
ИМХО, то, что вместо этого сделали тролли, гораздо лучший и более гибкий вариант.


Название: Русский текст в консольном QT приложении
Отправлено: fear от Май 23, 2006, 23:30
Цитата: "Steven_Orko"
Ты когда пишешь в тексте программы строку по-русски, то она у тебя хранится в кодировке винды, то есть в Windows-1251.


Возникает вопрос (случай для GUI QT приложения):
Если строка, которую пишешь в коде по-русски хранится в Windows-1251, то почему для коректного отображения русского языка приходится устанавливать кодек utf8? Т.е. если я тебя правильно понял, по-умолчанию строки сохраняются в Windows-1251 кодировке, а для их отображения по-умолчанию используется какая то другая кодировка? Вопрос, в чём логика такого подхода?


Название: Русский текст в консольном QT приложении
Отправлено: Steven_Orko от Май 23, 2006, 23:50
Потому, что, как я понял, Qt для отображения использует UNICODE в GUI.


Название: Re: Русский текст в консольном QT приложении
Отправлено: omorozov от Август 15, 2014, 15:17
Попробуй в самом начале функции main написать:

Код:
setlocale(LC_CTYPE, "Russian");
Вот это работает, спасибо!