Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/76: Рейтинг темы: голосов - 76, средняя оценка - 4.55
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36

Греческий в консоли

14.10.2014, 13:13. Показов 17099. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех!

Реализовываю некоторое подобие переводчика (крайне примитивный вариант). Удалось настроить русский язык, но как сделать корректным вывод греческого языка в консоль?

Так называемый "словарь" в виде обычного текстового документа содержит в себе греческие слова; в консоли все имеет вид "???".

Написала код с использованием stl, но, погуглив, натолкнулась на утверждение, что с stl вывести греческий не получится, нужно использовать библиотеку Qt.

Кто-нибудь сталкивался с подобным? Заранее благодарна за помощь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2014, 13:13
Ответы с готовыми решениями:

Не получается греческий
function DefinePolar (x0, y0, Polus, Radius, Angle, Place, Color, Length, Ratio) { var canvas = document.getElementById(Place); var...

греческий алфавит
Подскажите пожалуйста как можно использовать в поле label греческие буквы, например фи

Эрастофен, греческий философ
Эрастофен, греческий философ ( 230 г. до н.э.) ,составил алгоритм для нахождения простых чисел . Этот метод называется "решетом...

46
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 21:01
Лучший ответ Сообщение было отмечено sourcerer как решение

Решение

Студворк — интернет-сервис помощи студентам
Pumie, выдались свободные полчаса, решил посмотреть.

Цитата Сообщение от Pumie Посмотреть сообщение
Сдать я сдала, но все-таки докопаться до истины я бы хотела.
Докопаемся
Ну, в общем с MinGW сложности. Прикрутить msvcr80 получается, но из-за бага c fstat это не работает. На более новых версиях вроде бы бага уже нет, но оно все равно падает. В общем это не вариант.

Очень не хочется заниматься перекодировкой, во-первых это неэффективно, во-вторых мне лень, в третьих mingw 4.8.1 имеет проблемы с codecvt, а более новых версий я не встречал.

В общем в итоге я написал небольшой класс, наследник std::basic_streambuf, который занимается выводом в консоль нативными средствами (WinAPI) в юникоде. Работать будет везде (любая Windows NT, и любой компилятор для Windows поддерживающий стандарт С++98 и выше).
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
namespace win32api
{
 
inline bool read(HANDLE con, char * buf, uint32_t len, DWORD & rcount)
{
    return ::ReadConsoleA(con, buf, len, &rcount, 0) != 0;
}
inline bool read(HANDLE con, wchar_t * buf, uint32_t len, DWORD & rcount)
{
    return ::ReadConsoleW(con, buf, len, &rcount, 0) != 0;
}
 
inline bool write(HANDLE con, char const *buf, uint32_t len)
{
    DWORD dummy;
    return ::WriteConsoleA(con, buf, len, &dummy, 0) != 0;
}
inline bool write(HANDLE con, wchar_t const * buf, uint32_t len)
{
    DWORD dummy;
    return ::WriteConsoleW(con, buf, len, &dummy, 0) != 0;
}
 
}
 
template
<
    typename CharT, typename TraitsT = std::char_traits<CharT>
  , size_t BufSize = 256
  , size_t PtrBack = 4
>
class basic_streambuf_win32
    : public std::basic_streambuf<CharT, TraitsT>
{
    typedef std::basic_streambuf<CharT, TraitsT> base_streambuf;
 
    typedef typename base_streambuf::int_type    int_type;
    typedef TraitsT                              traits_type;
 
public:
    basic_streambuf_win32()
        : icon_(::GetStdHandle(STD_INPUT_HANDLE))
        , ocon_(::GetStdHandle(STD_OUTPUT_HANDLE))
    {
        std::memset(ibuf_, 0, sizeof(ibuf_));
        std::memset(obuf_, 0, sizeof(obuf_));
 
        this->setg(&ibuf_[0], &ibuf_[BufSize], &ibuf_[BufSize]);
        this->setp(&obuf_[0], &obuf_[BufSize]);
    }
    virtual ~basic_streambuf_win32()
    {
        sync();
    }
 
protected:
 
    virtual int_type overflow(int_type c)
    {
        if(this->pptr() >= this->epptr() && out() < 0)
        {
            return traits_type::eof();
        }
        return c == traits_type::eof()
            ? traits_type::not_eof(c)
            : this->sputc(traits_type::to_char_type(c));
    }
 
    virtual int_type underflow()
    {
        if(this->gptr() >= this->egptr() && in() < 0)
        {
            return traits_type::eof();
        }
        return this->sgetc();
    }
 
    virtual std::streamsize showmanyc()
    {
        return this->egptr() - this->gptr();
    }
 
    virtual int_type pbackfail(int_type c)
    {
        if(this->gptr() > this->eback())
        {
            if(c != traits_type::eof())
            {
                this->gptr()[-1] = traits_type::to_char_type(c);
            }
            this->gbump(-1);
            return traits_type::not_eof(c);
        }
        return traits_type::eof();
    }
 
    virtual int sync()
    {
        return out();
    }
 
private:
    int out()
    {
        std::streamsize const cnt = this->pptr() - this->pbase();
        bool const s = win32api::write(ocon_, this->pbase(), static_cast<uint32_t>(cnt));
        this->pbump(-static_cast<int>(cnt));
        return s ? static_cast<int>(cnt) : -1;
    }
 
    int in()
    {
        std::streamsize pb = this->gptr() - this->eback();
        if(PtrBack < pb)
        {
            pb = PtrBack;
        }
        std::memmove(this->eback(), this->gptr() - pb, static_cast<size_t>(pb * sizeof(CharT)));
        DWORD rcount;
        if(win32api::read(icon_, this->eback() + pb, static_cast<uint32_t>(BufSize - pb), rcount))
        {
            this->setg(this->eback(), this->eback() + pb, this->eback() + pb + rcount);
            return rcount;
        }
        return -1;
    }
 
private:
    CharT ibuf_[BufSize];
    CharT obuf_[BufSize];
 
    HANDLE icon_;
    HANDLE ocon_;
};

Добавим его в первоначальный код (setmode теперь не нужен):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <fcntl.h>
#include <io.h>
#include <stdint.h>
 
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
#include <streambuf>
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
 
#include <windows.h>
 
template <typename E, typename To, typename St = std::mbstate_t>
class null_codecvt
    : public std::codecvt<E, To, St>
{
public:
    typedef std::codecvt<E, To, St> base;
 
    explicit null_codecvt(size_t r = 0)
        : std::codecvt<E, To, St>(r)
    { }
 
protected:
    virtual typename base::result do_in(St &, To const *, To const *, To const * &, E *, E *, E * &) const
    {
        return base::noconv;
    }
    virtual typename base::result do_out(St &, E const *, E const *, E const * &, To *, E *, To * &) const
    {
        return base::noconv;
    }
    virtual typename base::result do_unshift(St &, To *, To *, To *&) const
    {
        return base::noconv;
    }
    virtual int do_length(St & state, To const * f1, To const * l1, size_t n2) const throw()
    {
        return (n2 < size_t(l1 - f1)) ? n2 : l1 - f1;
    }
    virtual bool do_always_noconv() const throw()
    {
        return true;
    }
    virtual int do_max_length() const throw()
    {
        return 2;
    }
    virtual int do_encoding() const throw()
    {
        return 2;
    }
};
 
// Тут должен быть вышеприведенный код....
 
int main()
{
    typedef basic_streambuf_win32<wchar_t> wstreambuf_win32;
 
    wstreambuf_win32 wb;
    std::wcout.rdbuf(&wb);
 
    // Очень важно открывать именно в бинарном режиме
    std::wifstream utf16File("test.txt", std::ios::binary);
 
    utf16File.imbue(std::locale(std::locale::classic(), new null_codecvt<wchar_t, char>));
 
    if(utf16File)
    {
        std::wstring text;
 
        std::getline(utf16File, text);
        {
            std::wcout << L"Russian text from file: " << text << std::endl;
        }
        std::getline(utf16File, text);
        {
            std::wcout << L"Greek text from file: " << text << std::endl;
        }
    }
    //.....
}

Кстати, можно использовать этот буфер и для юникодного ввода.
3
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 22:44  [ТС]
Если честно, то я восхищена.
Написать код, который
Цитата Сообщение от DrOffset Посмотреть сообщение
Работать будет везде (любая Windows NT, и любой компилятор для Windows поддерживающий стандарт С++98 и выше).
- просто чудо.
Но всё-таки недаром я новичок. Хороший код научусь писать ещё не скоро, но что я вынесла для себя из этого приключения:
1) MinGW создает кучу проблем, вывести в консоль желанный греческий крайне затруднительно.
2) В принципе, можно воспользоваться библиотекой Qt, вроде она больше приспособлена к решениям подобного рода задач.
3) Бросить Qt и воспользоваться Visual Studio.
4) Бросить Windows и перейти на Linux.
Где-нибудь ошиблась?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 23:04
Цитата Сообщение от Pumie Посмотреть сообщение
MinGW создает кучу проблем, вывести в консоль желанный греческий крайне затруднительно.
Т.к. он изначально чужеродный (из мира unix) и вынужден опираться на закрытое API, которое к тому же окружено кучей патентов microsoft - это немудрено. Но ситуация потихоньку исправляется. В принципе мое решение осталось в духе стандартной библиотеки, хоть и потребовало некоторых усилий. Так что можно сказать, все осталось в рамках приличия
Цитата Сообщение от Pumie Посмотреть сообщение
В принципе, можно воспользоваться библиотекой Qt, вроде она больше приспособлена к решениям подобного рода задач.
Самое главное - она цельная и практически полностью самодостаточная (потому что кроссплатформенная).
Цитата Сообщение от Pumie Посмотреть сообщение
Бросить Qt и воспользоваться Visual Studio.
В VS доступны все возможности, которые есть в windows для программистов. В этом ее большой плюс.
Цитата Сообщение от Pumie Посмотреть сообщение
Бросить Windows и перейти на Linux.
Скажем так, там тоже есть свои подводные камни, но если касаться локализации, то прозрачная поддержка UTF-8 любым API очень радует.

Цитата Сообщение от Pumie Посмотреть сообщение
Где-нибудь ошиблась?
Да вроде нет
2
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 23:21  [ТС]
Таким образом, это было просто чудесно!
Было очень приятно пообщаться с приятным и терпеливым профессионалом, я действительно узнала много нового (и хочу знать больше!).
Надеюсь, эта тема поможет таким же новичкам как я разобраться в дебрях нюансов программирования.

Я очень благодарная Вам, DrOffset, за этот урок. К сожалению, нигде так не разжевывается "Как именно это работает или не работает", а ведь подробное объяснение необходимо на начальном этапе изучения чего-либо (хотя, думаю, не только на начальном).
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
19.09.2018, 19:02
Цитата Сообщение от DrOffset Посмотреть сообщение
В общем в итоге я написал небольшой класс, наследник std::basic_streambuf, который занимается выводом в консоль нативными средствами (WinAPI) в юникоде. Работать будет везде (любая Windows NT, и любой компилятор для Windows поддерживающий стандарт С++98 и выше).
DrOffset, классно! Добавил это в прикреплённую тему про русификацию консоли под виндой.
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
21.09.2018, 09:20
sourcerer, прошу оценить ещё рецепт. Под win тест на Visual Studio. Попробовал решить вопрос глобально, переходом на юникод (идеи были ещё до меня, их множество в сети, я лишь собрал все в одну логику).
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.09.2018, 10:04
Цитата Сообщение от bedvit Посмотреть сообщение
sourcerer, прошу оценить ещё рецепт.
bedvit, добавил.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.09.2018, 10:04

Запись и чтение из тектового файла иностранных языков(греческий, Немецкий и т.п.)
Пишу небольшое приложение на c++ builder 6.0 по работе с текстом. Столкнулся с задачей сохранения в текстовик из элемента Memo текста на...

Отобразить в консоли:увеличить и уменьшить длину массива на заданное ранее из консоли число
Доброго дня суток, исходный код и задача есть Подскажите пж, не получается реализовать некоторые операции в консоли:увеличить и уменьшить...

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

Вызов консоли для другой вкладки из консоли js
Всем привет! Пишу скрипт для авто нажатия определенных элементов на сайте в определенной последовательности, чтобы в ручную не...

Клавиши F1-F12 в консоли, и работа с мышкой в консоли
Я искал на сайте, но не нашел упоминания о том как обрабатывать и или узнавать где находится курсор мышки (и еще мне надо бы узнать нажатие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru