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

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

14.10.2014, 13:13. Показов 17096. Ответов 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
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
14.10.2014, 22:59  [ТС]
Студворк — интернет-сервис помощи студентам
Да, все-таки не получается.
Файл сохранила в UTF-16LE, добавила указанный Вами кусок кода (для настройки консоли), но вот разобраться с "w" мне, видимо, не дано.
Не просила бы все так разжевывать, если бы у меня было время.
Алгоритмы, присущие обычным строкам (find, replace, length) не будут работать с "w"?
Тот факт, что у меня еще есть обычные строки (окончания), которые добавляются в процессе, вызовет противоречие? А то, что мы считываем запрашиваемое к переводу слово - будет ли играть роль, что у нас просто строки?
Заранее прощу прощения, если спрашиваю очевидные вещи. Правда нет времени обстоятельно во всем разбираться.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.10.2014, 23:16
Цитата Сообщение от Pumie Посмотреть сообщение
Алгоритмы, присущие обычным строкам (find, replace, length) не будут работать с "w"?
Будут. Насчет длины уже писал.
Цитата Сообщение от Pumie Посмотреть сообщение
Тот факт, что у меня еще есть обычные строки (окончания), которые добавляются в процессе, вызовет противоречие? А то, что мы считываем запрашиваемое к переводу слово - будет ли играть роль, что у нас просто строки?
В чем проблема добавлять сразу "широкие" строки (в коде они задаются с префиксом L)?

Добавлено через 2 минуты
Цитата Сообщение от Pumie Посмотреть сообщение
обычным строкам
На самом деле строки w - это для windows как раз обычные, а вот ANSI строки и голый char - не совсем. И это так на всех NT-системах, т.к. они изнутри юникодные.
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 00:09  [ТС]
Когда я читала свой "словарь" построчно, то лат-англ-рус-греч слова этой строки "распихивались по векторам:

C++
1
2
3
4
5
string lat;
//...
F>>lat;
//...
lat_dictionary.push_back(lat);
Каков будет синтаксис нынче? А то ругаки вылезли.
И сразу еще один вопрос: у меня происходило считывание пользовательской строки, затем создание некоторого массива (то, что программа в итоге должна была перевести):

C++ (Qt)
1
2
3
cout << "enter words to translate ";
    getline(wcin, sentence);
   for (istringstream iss(sentence); iss>>word;)
Каков будет синтаксис здесь?

Добавлено через 21 минуту
Второе - ерунда, достаточно написать wistringstream. Но вот первое..
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 00:53
Что-то я совсем забыл, что в виндовс так и не сделали нормальную поддержку локалей.
Ну да ладно, в общем вот я написал тут небольшую рыбу:
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
#include <fcntl.h>
#include <io.h>
#include <cstdio>
 
#include <iostream>
#include <fstream>
#include <string>
#include <codecvt>
#include <locale>
 
template <typename E, typename To, typename St = std::mbstate_t>
class null_codecvt
    : public std::codecvt<E, To, St>
{
public:
    explicit null_codecvt(size_t r = 0) 
        : std::codecvt<E, To, St>(r) 
    { }
 
protected:
    virtual result do_in(St &, To const *, To const *, To const * &, E *, E *, E * &) const
    {
        return noconv;
    }    
    virtual result do_out(St &, E const *, E const *, E const * &, To *, E *, To * &) const
    {
        return noconv;
    }
    virtual result do_unshift(St &, To *, To *, To *&) const
    {
        return 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()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout.clear();
 
    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;
 
        if(std::getline(utf16File, text))
        {
            std::wcout << L"Russian text from file: " << text << std::endl;
        }
        if(std::getline(utf16File, text))
        {
            std::wcout << L"Greek text from file: " << text << std::endl;
        }
    }
    getchar();
    //.....
}
Файлик, который я читаю, во вложении.
Вложения
Тип файла: txt test.txt (230 байт, 16 просмотров)
1
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 00:56
Цитата Сообщение от Pumie Посмотреть сообщение
Когда я читала свой "словарь" построчно, то лат-англ-рус-греч слова этой строки "распихивались по векторам:
string lat;
//...
F>>lat;
//...
lat_dictionary.push_back(lat);
Каков будет синтаксис нынче? А то ругаки вылезли.
Да тоже самое, только вместо string - wstring.
Или можно вот так (весь файл читаем в вектор):
C++
1
std::vector<std::wstring> data(std::istream_iterator<std::wstring>(file), std::istream_iterator<std::wstring>());
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 08:09  [ТС]
У Вас очень красивая рыба получилась Только вот не стану я сдавать того, что сама не напишу ближайшие лет 5
Наконец-то у меня перестали вылезать ругаки, но программа все равно не работает корректно (наверно, из-за этих самых локалей в windows).

Я благодарю Вас за помощь. Не ожидала встретить такую доброжелательность. Спасибо Вам за терпение, за потраченное время и готовность помогать) С такими учителями пропадает ощущение безысходности от непонимания материала.

Добавлено через 6 часов 38 минут
А можно я Вас ещё немножко помучаю?) Корректного вывода в консоль всё равно нет. Даже если "словарь" "зашит" в саму программу. Русский и греческий упорно отказываются выводиться вообще. А если добавляю вот эту строку:
C++ (Qt)
1
_setmode(_fileno(stdout), _O_U16TEXT);
не хочет выводить ничего вообще.
Если прошу считать с файла, то распихивается все по векторам опять же некорректно. Но зато русский и греческий хоть как-то отображаются (кракозябрами).
Работа самого словаря также прекратилась. Если раньше он мне хоть что-то переводил, то теперь не хочет.

Добавлено через 8 минут
Магия! Если сохраняю док-т в UTF-8, распихивается все по векторам корректно, русский и греческий также не выводятся, но словарь работает как полагается с англ. и лат.? Ну и как тут не удивиться? Уровень вопросов "почему" зашкаливает!
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 08:33
Цитата Сообщение от Pumie Посмотреть сообщение
Корректного вывода в консоль всё равно нет. Даже если "словарь" "зашит" в саму программу.
Можно этот вариант тут показать (минимальный пример)?

Цитата Сообщение от Pumie Посмотреть сообщение
Если прошу считать с файла, то распихивается все по векторам опять же некорректно. Но зато русский и греческий хоть как-то отображаются (кракозябрами).
Именно во избежание этого написан класс null_codecvt, он нужен для того, чтобы не производилось преобразование к char (т.е. фактически этот класс - заглушка, она блокирует преобразование, которое в данном случае нам не нужно). Там ниже создается новая локаль совместно с этим facet`ом и устанавливается (метод imbue) как текущая локаль для нашего файла. Про эту возможность стандартной библиотеки, кстати, есть у Страуструпа (Язык программирования С++). Рекомендую прочитать и использовать таки мой пример за основу
Цитата Сообщение от Pumie Посмотреть сообщение
Магия! Если сохраняю док-т в UTF-8, распихивается все по векторам корректно, русский и греческий также не выводятся, но словарь работает как полагается с англ. и лат.? Ну и как тут не удивиться? Уровень вопросов "почему" зашкаливает!
Английский и латинский - работают, а русский и греческий нет? В общем, не работает из-за локали по-умолчанию для файла, в ней нет информаци как перекодировать файл правильно (как я уже сказал, он пытается кодировать строки как char используя локаль по-умолчанию). Английский и латинский (базовая латиница 0000-007F совпадает с ASCII) имеют практически эквивалентные коды, потому выглядит так, как будто работает.
Я так скажу, лично мне неизвестен другой способ (т.е. кроме того, что я привел выше) заставить работать этот код без явной перекодировки строк. Поэтому предлагаю еще раз посмотреть на пост выше
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 08:41  [ТС]
Ваш код я пыталась разобрать, и теперь, после небольшого сёрфа, более или менее представляю о чем Вы.
Самая первая проблема, которая выскакивает - #include <codecvt> no such file(...) Эта библиотека сторонняя?
И не по теме: ребята говорят, самые простые примеры с кодировками, которые мне даже не удается у себя запустить, прекрасно работают в linux. Что такие проблемы-то с windows? Что ж все через..

Пример чего? Вывода или моей программы?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 08:47
Цитата Сообщение от Pumie Посмотреть сообщение
Самая первая проблема, которая выскакивает - #include <codecvt> no such file(...) Эта библиотека сторонняя?
Нет, она стандартная.
Версия компилятора у вас какая?

Добавлено через 1 минуту
Цитата Сообщение от Pumie Посмотреть сообщение
Пример чего? Вывода или моей программы?
Пример кода, который дает некорректный вывод.
0
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 08:48  [ТС]
Qt Creator 3.2.0 (enterprise). Полагаю, плохая)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 08:54
Цитата Сообщение от Pumie Посмотреть сообщение
#include <codecvt> no such file(...
Мне кажется он не нужен здесь. Закоментируйте эту строку.

Добавлено через 4 минуты
Цитата Сообщение от Pumie Посмотреть сообщение
Qt Creator 3.2.0 (enterprise). Полагаю, плохая)
Нет, не плохая
А компилятор на борту у нее какой? MinGW?
0
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 08:56  [ТС]
Нужен, он обеспечивает работу Ваших виртуальных функций.
Считывание с файла -> распихивание по векторам -> ну а там просто итератором проходим и выводим

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
std::wifstream F;
    F.open(("neww.txt"));
    if (!F)
        {
           cerr << "error opening " << endl;
           exit(1);
        }
 
    while (!F.eof())
        {
        wstring lat;
        wstring eng;
        wstring rus;
        wstring gr;
        F >> lat;
        F >> eng;
        F >> rus;
        F >> gr;
        lat_d.push_back(lat);
        eng_d.push_back(eng);
        rus_d.push_back(rus);
        gr_d.push_back(gr);
        }
Мой файл выглядит следующим образом: mel honey мед μέλι. И так несколько строк.


Он самый на борту, капитан
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 09:03
Цитата Сообщение от Pumie Посмотреть сообщение
Нужен, он обеспечивает работу Ваших виртуальных функций.
Т.е. если закоментировать, то не компилируется все равно (у меня просто нет сейчас под рукой виндовс)? Насколько я помню, все-таки std::codecvt (по крайней мере его специализация для <wchar_t, char> точно должна быть в <locale>, а не в <codecvt>.

Цитата Сообщение от Pumie Посмотреть сообщение
Считывание с файла -> распихивание по векторам -> ну а там просто итератором проходим и выводим
Не, я спрашивал про тот вариант, когда словарь зашит прямо в код и все равно не работает (кстати какая кодировка самого исходника?). И желательно полный пример с main и заголовками, тут любая деталь может быть важна
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 09:15  [ТС]
Да, если закомментить, не компилируется. 'result' doesn't name a type
О, Вы правы, кодировка стояла UTF-8. Но я успела поиграться с ними: если поставить UTF-16, то мой код чудесным образом выглядит иероглифами.
Не хотела выкладывать код, но по фотографии лечить и правда сложно
Не знаю, как поставить скролл, так что вот ссылка http://codepaste.ru/18153/

Реализовано опять же с некоторым подобием окончания
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 09:31
Цитата Сообщение от Pumie Посмотреть сообщение
Он самый на борту
В таком случае, <codecvt> - это заголовок из С++11, в MinGW С++11 активировать ключом -std=c++11 (нужно прописать его в pro-файле).

Добавлено через 5 минут
Цитата Сообщение от Pumie Посмотреть сообщение
'result' doesn't name a type
А, вот в чем дело. Ну тут моя вина. Вот исправленный вариант. Заголовочный файл codecvt - не нужен.
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
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;
    }
};
Добавлено через 7 минут
Цитата Сообщение от Pumie Посмотреть сообщение
кодировка стояла UTF-8
Ее и оставьте - это правильно. MinGW по умолчанию считает, что файлы в этой кодировке, поэтому локализованный текст записанный с L должен правильно кодироваться в wide char.
2
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 09:34  [ТС]
Ваш код: документ в UTF-16 LE, сам код в UTF-8. Все так? Единственное, что получаю в консоль, - R
Как и у меня, только первая буква первой выводимой фразы
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 09:37
Цитата Сообщение от Pumie Посмотреть сообщение
Ваш код: документ в UTF-16 LE, сам код в UTF-8. Все так? Единственное, что получаю в консоль, - R
Понятно.

Цитата Сообщение от Pumie Посмотреть сообщение
Как и у меня, только первая буква первой выводимой фразы
Возможно. Беда в том, что я почему-то подумал, что у вас VS, соответственно вчера проверил только на VS (там все хорошо работает). Нужно взять небольшой таймаут и перепроверить на MinGW, может быть в этом и моя вина
2
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 10:01  [ТС]
Ни в чем Вашей вины уж точно нет. Спасибо за то, что вообще занимаетесь этим и не бросаете.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
15.10.2014, 11:24
Pumie, в общем проблема ясна, MinGW не может правильно выставить режим для консоли, т.к. не поддерживает по-умолчанию msvcr80 (эта возможность появилась начиная с этой версии). Поэтому указанный способ в нем не заработает.
Выходов несколько:
1) Использовать VS Express (она бесплатная и там все работает);
2) Реализовать на MinGW, с перекодировкой в UTF-8 (SetConsoleOutputCP(65001) должен работать нормально, + в С++11 есть facet`ы для работы с utf8 (см тут);
3) Научить mingw работать с msvcr80, вместо msvcrt. Инструкция здесь.
4) Использовать средства Qt для локализации приложения (в Qt QString - юникодная).

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

Добавлено через 10 минут
Pumie, забыл добавить: нужно не забыть поменять шрифт в консоли на Lucida Console (без этого точно ничего не заработает, т.к. нужен шрифт поддерживающий юникод).
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
15.10.2014, 12:53  [ТС]
1 вариант - попробую установить VS, только у меня она капризничает и устанавливаться не хочет.
Второй вариант требует подключения хедера codecvt, который у меня не подключается.
3 вариант возможен.
4 вариант - переписать лабу с использование библиотеки Qt - пробовала, ничего хорошего у меня не вышло. Stl хотя бы работает.
Шрифт давно стоит такой

Добавлено через 1 час 19 минут
Сдать я сдала, но все-таки докопаться до истины я бы хотела.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.10.2014, 12:53

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
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