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

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

Страниц: 1 [2] 3 4 ... 6   Вниз
  Печать  
Автор Тема: Вывод русских символов в консоль  (Прочитано 62714 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #15 : Февраль 16, 2014, 11:36 »

я лишь показал один из способов, использовать его или нет, это решать ТС
Записан
8Observer8
Гость
« Ответ #16 : Февраль 16, 2014, 14:03 »

для вывода текста в консоль русского я делаю так
Код:
qDebug(qPrintable(someQstringInUTF8));

Спасибо за ответ! Но у меня не работает:

Вывод: ?????? ??? !

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString string = "Привет мир !";
   qDebug() << qPrintable(string.toUtf8());
 
   return a.exec();
}
 

для вывода текста в консоль русского я делаю так
Код:
qDebug(qPrintable(someQstringInUTF8));

Безотносительно темы, такой способ вывода строк - это потенциальная уязвимость, см. "format string attack"

Спасибо за ответ! Я запомню: может пригодится. В хакерских атаках ничего не понимаю. Я слышал, что есть такая популярная среди хакеров методика взлома - переполнение буфера. Здесь, видимо, это имелось ввиду.
« Последнее редактирование: Февраль 16, 2014, 14:10 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #17 : Февраль 17, 2014, 10:49 »

Так как же всё таки русский текст выводить с помощью qDebug()?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #18 : Февраль 17, 2014, 11:13 »

http://qt-project.org/doc/qt-5/qtextcodec.html#setCodecForLocale
Записан
8Observer8
Гость
« Ответ #19 : Февраль 17, 2014, 11:30 »


Спасибо огромное! Как же всё таки приятно иметь дело с профи  Улыбающийся

Вывод:
Цитировать
std::cout = Привет мир!
TextStream = Привет мир!
qDebug() =  "Привет мир!"
Enter a text: Привет
From a console = Привет

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
#include <QTextStream>
#include <iostream>
 
QTextStream cin(stdin);
QTextStream cout(stdout);
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString string = "Привет, Мир!";
   QTextCodec *codec = QTextCodec::codecForName("CP866");
 
   // std::cout
   QByteArray encodedString = codec->fromUnicode(string);
   std::cout << "std::cout = " << encodedString.data() << std::endl;
 
   // TextStream
   cout.setCodec(codec);
   cout << "TextStream = " << string << "\n";
   cout.flush();
 
   // qDebug
   QTextCodec::setCodecForLocale(codec);
   qDebug() << "qDebug() = " <<  string;
 
   // Console r/w
   cout << "Enter a text: ";
   cout.flush();
   cin.setCodec(codec);
   QString inputStr;
   // Read data from a console
   cin >> inputStr;
   cout << "From a console = " << inputStr << endl;
   cout.flush();
 
   return a.exec();
}
 
« Последнее редактирование: Февраль 17, 2014, 12:18 от 8Observer8 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #20 : Февраль 17, 2014, 14:51 »

кириллицу и прочие не-ASCII символы лучше вообще не использовать в коде
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #21 : Февраль 17, 2014, 15:07 »

кириллицу и прочие не-ASCII символы лучше вообще не использовать в коде

В идеале - да Улыбающийся
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #22 : Февраль 17, 2014, 22:40 »

кириллицу и прочие не-ASCII символы лучше вообще не использовать в коде
Ну не используете вы кириллицу в коде, а приходит она из транслейта. Вопроса кодировки консоли это же никак не меняет.
Записан
8Observer8
Гость
« Ответ #23 : Июнь 23, 2014, 12:07 »

Код
C++ (Qt)
QString string = "Привет мир !";
QTextCodec *codec = QTextCodec::codecForName("CP866");
QByteArray encodedString = codec->fromUnicode(string);
std::cout << encodedString.data();
 

Посмотрите, пожалуйста, почему у меня такой вывод: ЏаЁўҐв!

Код
C++ (Qt)
#ifndef SHOWER_H
#define SHOWER_H
 
#include <iostream>
 
#include <QObject>
#include <QString>
#include <QTextCodec>
#include <QByteArray>
 
class Shower : public QObject
{
   Q_OBJECT
 
public slots:
   void show( QString *content )
   {
       QTextCodec *codec = QTextCodec::codecForName("CP866");
       QByteArray encodedString = codec->fromUnicode( *content );
       std::cout << encodedString.data( ) << std::endl;
   }
};
 
#endif // SHOWER_H
 
Записан
VanDerSam
Гость
« Ответ #24 : Июнь 23, 2014, 13:22 »

Здравствуйте.
Посмотрите под отладчиком содержимое строки content. Если там "ерунда", то надо смотреть, каким способом устанавливаются данные в объект типа QString. Возможно для конструктора преобразования из const char * не установлен кодек.
Записан
8Observer8
Гость
« Ответ #25 : Июнь 23, 2014, 15:21 »

Там не ерунда:
Записан
8Observer8
Гость
« Ответ #26 : Сентябрь 02, 2014, 17:34 »

Решение найдено! С помощью std::cout выводится так:
Код
C++ (Qt)
#include <iostream>
#include <QTextCodec>
#include <QObject>
 
#define STR(s) ((QTextCodec::codecForLocale()->fromUnicode(s)).constData())
 
int main()
{
   std::cout << STR( QObject::tr( "Привет, Мир!" ) );
}
 
« Последнее редактирование: Сентябрь 02, 2014, 17:58 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #27 : Сентябрь 02, 2014, 18:37 »

Решение найдено!
Нет, не найдено.
На машине с локалью, отличающейся от машины где собиралась программа, будут крякозябры.
Записан
8Observer8
Гость
« Ответ #28 : Сентябрь 19, 2014, 10:56 »

Решение найдено!
Нет, не найдено.
На машине с локалью, отличающейся от машины где собиралась программа, будут крякозябры.
А как правильно, тогда? Веселый
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #29 : Сентябрь 19, 2014, 11:29 »

А как правильно, тогда? Веселый
Нужно использовать кодек той кодировки, в которой выполнен исходный код программы.
Записан
Страниц: 1 [2] 3 4 ... 6   Вверх
  Печать  
 
Перейти в:  


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