Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: arial от Июль 30, 2009, 14:48



Название: Кириллица в консоли windows
Отправлено: arial от Июль 30, 2009, 14:48
Второй день бъюсь с локализацией сообщений в консоли windows.
Локализованный текст выводится кракозябрами.
Облазил весь форум - ничего не помогает.
Помогите найти ошибку.

Пишу в Qt Creator 1.2.1:

ConsoleTest.pro (ANSI):
Код:
QT       -= gui

TARGET = ConsoleTest
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

TRANSLATIONS = myapp_ru_RU.ts

SOURCES += main.cpp

main.cpp (ANSI):
Код
C
#include <QtCore>
#include <QtCore/QCoreApplication>
#include <QTextCodec>
#include <QTranslator>
#include <iostream>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
   QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
 
   QTranslator myappTranslator;
   bool res = myappTranslator.load("myapp_" + QLocale::system().name());
   a.installTranslator(&myappTranslator);
 
   std::cout << QObject::tr("Hello!").toStdString() << std::endl;
 
   return a.exec();
}

myapp_ru_RU.ts (UTF-8):
Код
XML
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="ru_RU">
<context>
   <name>QObject</name>
   <message>
       <location filename="main.cpp" line="18"/>
       <source>Hello!</source>
       <translation>Привет!</translation>
   </message>
</context>
</TS>


Название: Re: Кириллица в консоли windows
Отправлено: Winstrol от Июль 30, 2009, 14:54
Второй день бъюсь с локализацией сообщений в консоли windows.
В консоли ввести chcp 1251  и поменять шрифт на Lucida Console.


Название: Re: Кириллица в консоли windows
Отправлено: lit-uriy от Июль 30, 2009, 15:04
>>В консоли ввести chcp 1251  и поменять шрифт на Lucida Console.
А с каких пор в консоли русского виндовоза кодирвка виндового ГУЯ, вместо IBM866?


Название: Re: Кириллица в консоли windows
Отправлено: arial от Июль 30, 2009, 15:10
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("IBM866"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("IBM866"));
Помогло. Спасибо!


Название: Re: Кириллица в консоли windows
Отправлено: arial от Июль 30, 2009, 15:30
Поменял
Код
C
std::cout << QObject::tr("Hello!").toStdString() << std::endl;
на
Код
C
qDebug() << QObject::tr("Hello!");
и снова появились кракозябры. Почему так?  ???


Название: Re: Кириллица в консоли windows
Отправлено: Winstrol от Июль 30, 2009, 15:33
>>В консоли ввести chcp 1251  и поменять шрифт на Lucida Console.
А с каких пор в консоли русского виндовоза кодирвка виндового ГУЯ, вместо IBM866?
Если программа написана человеком, который русский не знает, выбросить и не пользоваться? Почему он должен заботиться о русской консоли?


Название: Re: Кириллица в консоли windows
Отправлено: kuzulis от Июль 30, 2009, 15:51
я делал так:
Код:
....
    QCoreApplication app(argc, argv);
#ifdef Q_OS_WIN32
QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));
#endif
QTranslator translator;
...
и вроде все работало


Название: Re: Кириллица в консоли windows
Отправлено: lit-uriy от Июль 30, 2009, 15:55
>>Почему он должен заботиться о русской консоли?
Потому-что "Кириллица в консоли windows" и "В консоли ввести chcp 1251..." соответсвуют скорее русской консоли в виндовозе. (конечно, консоль может быть и украинская, но она тоже не будет CP-1251)


Название: Re: Кириллица в консоли windows
Отправлено: Winstrol от Июль 30, 2009, 16:41
>>Почему он должен заботиться о русской консоли?
Потому-что "Кириллица в консоли windows" и "В консоли ввести chcp 1251..." соответсвуют скорее русской консоли в виндовозе. (конечно, консоль может быть и украинская, но она тоже не будет CP-1251)
Это потрясающе, что вы знаете, какая кодировка в украинской консоли. Только разработчикам консольных клиентов, допустим, для систем контроля версий на это до лампочки. Что делать прикажете делать? Комментарии к ревизиям на английском писать?


Название: Re: Кириллица в консоли windows
Отправлено: denka от Июль 30, 2009, 16:58
To Winstrol
Не пойму к чему эти холивары. Автор темы спросил совета, вы дали не правильный(на счет кодировки), Юрий вас поправил и в результате вы устроили диспут на счет должна ли вобще программа работающая в консоли выводит русские буквы. Честно не вижу связи с темой топика. Может мы еще обсудим а стоит ли вобще локализировать ПО?


Название: Re: Кириллица в консоли windows
Отправлено: Winstrol от Июль 30, 2009, 20:42
To Winstrol
Не пойму к чему эти холивары. Автор темы спросил совета, вы дали не правильный(на счет кодировки),
Я как раз дал работающий ответ, а вот работают ли всегда хаки вроде
QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));
не уверен. В недрах Qt или драйвера БД запросто может оказаться вызов fromLocal8Bit ожидающий CP1251.


Название: Re: Кириллица в консоли windows
Отправлено: lit-uriy от Июль 30, 2009, 22:09
кодек для локали жёстко задавать действительно не надо.
Т.к. всё пишется на Qt, лучше использовать текстовый поток вместо std::out
И установить для данного потока соответствующий кодек.
Т.е.:
Код
C++ (Qt)
QTextStream out(stdout);
out.setCodec(...);
out <<  QObject::tr("Привет!");