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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кириллица в консоли windows  (Прочитано 18821 раз)
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>
Записан
Winstrol
Гость
« Ответ #1 : Июль 30, 2009, 14:54 »

Второй день бъюсь с локализацией сообщений в консоли windows.
В консоли ввести chcp 1251  и поменять шрифт на Lucida Console.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Июль 30, 2009, 15:04 »

>>В консоли ввести chcp 1251  и поменять шрифт на Lucida Console.
А с каких пор в консоли русского виндовоза кодирвка виндового ГУЯ, вместо IBM866?
Записан

Юра.
arial
Гость
« Ответ #3 : Июль 30, 2009, 15:10 »

Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("IBM866"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("IBM866"));
Помогло. Спасибо!
Записан
arial
Гость
« Ответ #4 : Июль 30, 2009, 15:30 »

Поменял
Код
C
std::cout << QObject::tr("Hello!").toStdString() << std::endl;
на
Код
C
qDebug() << QObject::tr("Hello!");
и снова появились кракозябры. Почему так?  Непонимающий
Записан
Winstrol
Гость
« Ответ #5 : Июль 30, 2009, 15:33 »

>>В консоли ввести chcp 1251  и поменять шрифт на Lucida Console.
А с каких пор в консоли русского виндовоза кодирвка виндового ГУЯ, вместо IBM866?
Если программа написана человеком, который русский не знает, выбросить и не пользоваться? Почему он должен заботиться о русской консоли?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Июль 30, 2009, 15:51 »

я делал так:
Код:
....
    QCoreApplication app(argc, argv);
#ifdef Q_OS_WIN32
QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));
#endif
QTranslator translator;
...
и вроде все работало
Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июль 30, 2009, 15:55 »

>>Почему он должен заботиться о русской консоли?
Потому-что "Кириллица в консоли windows" и "В консоли ввести chcp 1251..." соответсвуют скорее русской консоли в виндовозе. (конечно, консоль может быть и украинская, но она тоже не будет CP-1251)
Записан

Юра.
Winstrol
Гость
« Ответ #8 : Июль 30, 2009, 16:41 »

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

To Winstrol
Не пойму к чему эти холивары. Автор темы спросил совета, вы дали не правильный(на счет кодировки), Юрий вас поправил и в результате вы устроили диспут на счет должна ли вобще программа работающая в консоли выводит русские буквы. Честно не вижу связи с темой топика. Может мы еще обсудим а стоит ли вобще локализировать ПО?
Записан
Winstrol
Гость
« Ответ #10 : Июль 30, 2009, 20:42 »

To Winstrol
Не пойму к чему эти холивары. Автор темы спросил совета, вы дали не правильный(на счет кодировки),
Я как раз дал работающий ответ, а вот работают ли всегда хаки вроде
QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM 866"));
не уверен. В недрах Qt или драйвера БД запросто может оказаться вызов fromLocal8Bit ожидающий CP1251.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Июль 30, 2009, 22:09 »

кодек для локали жёстко задавать действительно не надо.
Т.к. всё пишется на Qt, лучше использовать текстовый поток вместо std::out
И установить для данного потока соответствующий кодек.
Т.е.:
Код
C++ (Qt)
QTextStream out(stdout);
out.setCodec(...);
out <<  QObject::tr("Привет!");
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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