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

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

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

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

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

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

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

Кто-нибудь сталкивался с подобным? Заранее благодарна за помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2014, 13:13
Ответы с готовыми решениями:

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

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

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

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

46
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
14.10.2014, 13:37 2
В Windows консоль по-умолчанию работает в кодировке cp866, которая греческие символы выводить не даст. К тому же далеко не все консольные шрифты содержат в себе греческие символы. Так что необходимо выполнение двух условий:
1. Наличие нужных символов в текущем шрифте консоли. Этот шрифт настраивается в свойствах ярлыка или самого окна. В Win7 единственным стандартным шрифтом с греческими символами является Lucida Console.
2. Активной кодовой страницей, допускающей вывод таких символов. Греческая или одна из Unicode-кодировок, например, UTF-8. Изменяется командой chcp или в реестре.
Миниатюры
Греческий в консоли  
1
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,671
14.10.2014, 13:46 3
Просто не нужно использовать консоль для таких целей.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.10.2014, 13:55 4
Лучший ответ Сообщение было отмечено Pumie как решение

Решение

Pumie, Какие среда разработки и ОС?

Если Windows и Visual Studio (берем их как самый распространенный вариант), то решение такое:
Файлик сохраняем в UTF-16, переводим консоль в режим юникода.
C++
1
2
3
4
5
6
7
8
9
10
#include <fcntl.h>
#include <io.h>
 
//.....
int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
 
    //.....
}
И пользуемся std::wcout, std::wstring для хранения и отобржения строк, std::wofstream для загрузки файла.
Смотрим, чтобы шрифты консоли поддерживали юникод.
Этого должно хватить.
PS. Т.к. у меня нет на работе винды, то пишу по памяти.
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
14.10.2014, 14:00  [ТС] 5
Спасибо за Ваш ответ.

Шрифт у меня давно такой стоит, но вот насчет команды chcp: могу я это прописать как-то в своей программе (интуитивно, какая-нибудь system ("chcp 65001"))?
Решит ли это проблему считывания из самого текстового файла?
Как мне объясняли, при работе с такими немассовыми языками возникает несколько проблем:
1) считается ли верно из файла? (нужно сохранить сам файл в определенном виде - Unicode?)
2) корректно ли выведется?
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
14.10.2014, 14:05 6
Цитата Сообщение от Pumie Посмотреть сообщение
могу я это прописать как-то в своей программе (интуитивно, какая-нибудь system ("chcp 65001"))?
Можете, чуть выше ответили.

Цитата Сообщение от Pumie Посмотреть сообщение
Решит ли это проблему считывания из самого текстового файла?
Нет, это только вывод. Считывание нужно вести с учетом того, что один символ может занимать несколько байт (сколько -- зависит от выбранной кодировки). И для корректной работы с такими строками, читать их нужно в соответствующий строковой тип, согласно правилам выбранной вами библиотеки классов.

Цитата Сообщение от Pumie Посмотреть сообщение
считается ли верно из файла? (нужно сохранить сам файл в определенном виде - Unicode?)
Да, файл со словарем лучше держать в юникоде, читается он так же, как и любой другой файл, но со считанными данными работает согласно правилам юникода.

Цитата Сообщение от Pumie Посмотреть сообщение
корректно ли выведется?
А вот за вывод и отвечает шрифт и текущая кодовая страница консоли.
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
14.10.2014, 14:06  [ТС] 7
Qt Creator и Windows.
К сожалению, не знаю, как сохранить обычный блокнотовский документ в UTF-16. Насколько мне известно, он сохраняется либо UTF-8 (вроде есть разница), либо Unicode, либо ansi.
Может, просто использовать другой текстовый редактор?
Про решение "И пользуемся std::wcout, std::wstring для хранения и отобржения строк, std::wofstream для загрузки файла." уже читала, попробую узнать, как именно с этим работать. Но сразу вопрос: я могу использовать этот способ только для греческого языка или мне придется и работу с другими языками изменять добавлением "w"?
0
Заблокирован
14.10.2014, 14:08 8
Цитата Сообщение от nmcf Посмотреть сообщение
Просто не нужно использовать консоль для таких целей.
Согласна.

Цитата Сообщение от Pumie Посмотреть сообщение
Реализовываю некоторое подобие переводчика
Делайте с помощью Windows Forms - красиво, просто и быстро.
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
14.10.2014, 14:10 9
Цитата Сообщение от Pumie Посмотреть сообщение
Насколько мне известно, он сохраняется либо UTF-8 (вроде есть разница), либо Unicode, либо ansi.
Unicode -- это и есть UTF-16, но там есть еще разница между Big и Little Indian (на PC используется в основном Little, но возможны варианты).

Цитата Сообщение от Pumie Посмотреть сообщение
Может, просто использовать другой текстовый редактор?
Рекомендую AkelPad, там можно выбирать кодировку из очень большого списка.

Цитата Сообщение от Pumie Посмотреть сообщение
Но сразу вопрос: я могу использовать этот способ только для греческого языка или мне придется и работу с другими языками изменять добавлением "w"?
"w" -- это от Wide Char, т.е. "широкий символ", что обозначает юникод и одинаково годится для любого языка: от английского до хинди.
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.10.2014, 14:14 10
Цитата Сообщение от Pumie Посмотреть сообщение
Но сразу вопрос: я могу использовать этот способ только для греческого языка или мне придется и работу с другими языками изменять добавлением "w"?
Абстрагирутесь от языков. В идеале программа должна быть написана так, чтобы любой язык можно было использовать. В этом юникод как раз и поможет.
Цитата Сообщение от Pumie Посмотреть сообщение
К сожалению, не знаю, как сохранить обычный блокнотовский документ в UTF-16.
Unicode - это в терминологии блокнота и есть UTF-16 (никогда не понимал почему нельзя было написать там по-человечески).
1
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
14.10.2014, 14:17 11
Цитата Сообщение от DrOffset Посмотреть сообщение
Unicode - это в терминологии блокнота и есть UTF-16 (никогда не понимал почему нельзя было написать там по-человечеки).
В общем случае UNICODE не есть UTF-16. Второй является лишь подмножеством первого, который не захардкорен на 16 бит/символ и, возможно, "блокнот" это поддерживает.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.10.2014, 14:22 12
Цитата Сообщение от quwy Посмотреть сообщение
В общем случае UNICODE не есть UTF-16
Так и я об этом. Почему у них UTF-8 отдельно, а Unicode отдельно. UTF-8 - это же тоже юникод. Не так много там вариантов, чтобы нельзя было их отдельно прописать, если даже хотели заложить раширение списка кодировок на будущее.

Цитата Сообщение от quwy Посмотреть сообщение
Возможно, "блокнот" это поддерживает
В том-то и дело, что нет.
Ну да ладно.
0
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
14.10.2014, 14:28  [ТС] 13
Итак, в итоге я для себя уяснила:
1) для корректного вывода - system ("chcp 65001")
2) сам документ сохраняем в Юникоде, либо UTF-8, что, как я выяснила благодаря Вам, одно и то же
3) корректное считывание из файла. Тут мне поможет магическая буковка "w" (wchar, wstring)

Я ничего не упустила?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.10.2014, 14:33 14

Не по теме:

Вообще, у меня сейчас появилась мысль, что это такой маркетинг.
Во времена перехода на NT microsoft во всех возможных местах писали как круто, что у них теперь везде юникод. И тут прописали именно так, чтобы пользователи ассоциировали рекламу и новые возможности ПО (в том числе и блокнота). Видимо считали, что загружать пользователя какая там кодировка UCS-16 или UTF-16 или еще что, не нужно - главное - это юникод :).



Добавлено через 2 минуты
Цитата Сообщение от Pumie Посмотреть сообщение
сам документ сохраняем в Юникоде, либо UTF-8, что, как я выяснила благодаря Вам, одно и то же
Только UTF-16
Цитата Сообщение от Pumie Посмотреть сообщение
для корректного вывода - system ("chcp 65001")
Конкретно 65001 - это UTF-8, в этом случае версии с w не будут корректно работать, т.к. UTF-8 не хранится в "широких" символах.

Нужно еще раз прочитать прошлые посты
1
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
14.10.2014, 14:41  [ТС] 15
Прошу прощения, сложно дается новый материал.
Чтобы работать с w, нужно иметь документ в UTF-16, так? А саму консоль нужно будет настроить на корректный вывод UTF-16 (тем кусочком кода, что Вы показывали ранее).
Теперь я верно поняла?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
14.10.2014, 15:16 16
Цитата Сообщение от Pumie Посмотреть сообщение
Теперь я верно поняла?
Все верно.

Pumie, Можно использовать и UTF8, вместо UTF-16, там в моем примере выше тогда нужно будет заменить _O_U16TEXT на _O_U8TEXT.
Нужно только помнить, что длина строки UTF-8 не равна количеству байт в std::string, т.к. символ кодируется несколькими байтами (до 6 байт на символ в зависимости от языка). (Для UTF16 аналогично, только речь идет о 16-битных машинных словах, а не о байтах. В UTF-16 на один символ может приходиться до 2х 16-битных слов - правда в случае греческого будет использовано только первое слово, как и в случае большинства других языков).

Добавлено через 20 минут
Pumie, В общем пробуйте, если что не получится, то уточните здесь.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.10.2014, 15:34 17
Цитата Сообщение от DrOffset Посмотреть сообщение
до 6 байт на символ в зависимости от языка
Цитата Сообщение от DrOffset Посмотреть сообщение
до 2х 16-битных слов
Что-то не стыкуется. Может всё же до 3х 16-битных?
0
54 / 4 / 3
Регистрация: 15.06.2014
Сообщений: 36
14.10.2014, 15:37  [ТС] 18
Конечно, спасибо Вам большое!
Попробую и отпишусь!
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
14.10.2014, 15:43 19
Цитата Сообщение от Tulosba Посмотреть сообщение
Что-то не стыкуется. Может всё же до 3х 16-битных?
Не, все правильно. UTF-8 кодируется гораздо хитрее, чем UTF-16. В первом символ может занимать 1, 2, 3, 4, 5 или 6 байт, а во втором только 2 или 4.
1
DrOffset
14.10.2014, 19:03     Греческий в консоли
  #20

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Что-то не стыкуется. Может всё же до 3х 16-битных?
Сам подумай, UTF-32 хватает для всех языков на планете (и еще место остается). Так нафига в UTF-16 третье слово?
Ну и quwy прав, конечно же.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2014, 19:03

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru