Настройка консоли на отображение Unicode
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.84] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Настройка консоли на отображение Unicode
|
|
|
|
|
Здрааствуйте!
Подскажите, пожалуйста, как сделать чтобы в Консоли отображались вот такие значки?: Символы: ❌ ✅ ⚡ ♥ ♦ ♣ ♠ ★ ☆ ☀ ☁ ☂ ☃" Широкие символы: |
|
Сообщ.
#2
,
|
|
|
|
Цитата DDim1000 @ Найдите моноширинный шрифт который их содержит и поставьте для отображения в консоли. |
|
|
|
|
|
Цитата sharky72 @ Цитата DDim1000 @ Найдите моноширинный шрифт который их содержит и поставьте для отображения в консоли. Как это сделать? |
|
Сообщ.
#4
,
|
|
|
|
Цитата DDim1000 @ Что? Найти шрифт или настроить его в консоли? Какой консоли? старой или новой (Win11)? Дать вам ссылку как посмотреть и установить настройки по умолчанию для консоли Windows? Если что это к теме c++ не имеет отношения, скорее к настройкам ОС Может проще вам отказаться от консоли и сделать нормальный UI? |
|
Сообщ.
#5
,
|
|
|
|
Если очень хочется, то в винде подходящим для указанных символов шрифтом будет "SimSun". Есть ещё его вариации. Установить кодовую страницу SetConsoleOutputCP() уже советовали, установить шрифт можно SetCurrentConsoleFontEx(). Только вот зачем всё это?
|
|
Сообщ.
#6
,
|
|
|
|
[
] Кстати вот, подумалось вдруг. Дум на чём только не запускали. Даже для консоли есть ASCII-артовый рендер. Почему никто не догадался написать рендер в фонт? Даже цвет можно добавить... [/ ] |
|
Сообщ.
#7
,
|
|
|
|
Цитата DDim1000 @ Здрааствуйте! Подскажите, пожалуйста, как сделать чтобы в Консоли отображались вот такие значки?: Символы: ❌ ✅ ⚡ ♥ ♦ ♣ ♠ ★ ☆ ☀ ☁ ☂ ☃" Широкие символы: В стандартной виндовой - никак! Но можно вместо нее использовать ConEmu. Вот пример, как может выглядеть редактор Far'а: Прикреплённая картинка
Шрифт установлен Jet Brains Mono. Но Courier, Consolas тоже норм отображают. Остальные моноширинные просто не смотрел. Хотя "моноширинность" для emoji - мягко говоря, так себе. |
|
Сообщ.
#8
,
|
|
|
|
Majestio, хватит на винду наезжать. Чай не первый раз уже.
![]() ![]() #include <windows.h> #include <iostream> #include <locale> #include <string> #include <cwchar> std::string smiles = "\xE2\x9D\x8C\xE2\x9C\x85\xE2\x9A\xA1\xE2\x99\xA5\xE2\x99\xA6\xE2\x99" "\xA3\xE2\x99\xA0\xE2\x98\x85\xE2\x98\x86\xE2\x98\x80\xE2\x98\x81\xE2" "\x98\x82\xE2\x98\x83"; int main() try { std::locale locRusUTF8("russian.utf8"); CONSOLE_FONT_INFOEX fnInfoOld, fnInfoNew; UINT oldCP = GetConsoleOutputCP(); if (oldCP == 0) return std::cerr << "GetConsoleOutputCP() failed: " << GetLastError() << std::endl, 2; std::cout.imbue(locRusUTF8); fnInfoOld.cbSize = sizeof(fnInfoOld); if (!GetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &fnInfoOld)) return std::cerr << "GetCurrentConsoleFontEx() failed: " << GetLastError() << std::endl, 1; fnInfoNew = fnInfoOld; wcscpy(fnInfoNew.FaceName, L"SimSun"); if (!SetConsoleOutputCP(65001)) return std::cerr << "SetConsoleOutputCP() failed: " << GetLastError() << std::endl, 2; if (!SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &fnInfoNew)) return std::cerr << "SetCurrentConsoleFontEx() failed: " << GetLastError() << std::endl, SetConsoleOutputCP(oldCP), 1; std::cout << smiles << std::endl; []{ char ch; std::cin >> ch; }(); return !SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &fnInfoOld) + (SetConsoleOutputCP(oldCP) != 0) * 2; } catch(...) { std::cerr << "No russian UTF8 locale\n"; } P.S. Наполненность SimSun юникодом я не проверял. Вряд ли он там весь, как в Unifont Добавлено P.P.S. Гы, счас проверил, Unifont тоже можно поставить. Рекомендую. |
|
Сообщ.
#9
,
|
|
|
|
Цитата Qraizer @ Majestio, хватит на винду наезжать. Чай не первый раз уже. Ну ок, скинь тогда скрин вывода emoji в стандартном виндовом терминале, вот как я постом выше. ChatGPT разъяснил ситуацию Кстати, попробовал новый виндовый терминал - там тоже норм. Но он входит в состав Windows начиная с Windows 10 (build 18309) и Windows 11. Так что можно сказать, что это не стандартная, а дополнительная фича. Пользователям 8,7, Vista одна дорога ConEmu. Вот как выглядит редактор Far'а, запущенного в Windows Terminal: Прикреплённая картинка
|
|
Сообщ.
#10
,
|
|
|
|
Цитата Majestio @ Какой-такой терминал-шмитернал... стандартный CMDНу ок, скинь тогда скрин вывода emoji в стандартном виндовом терминале, вот как я постом выше. Прикреплённая картинка
Достаточно? Добавлено Цитата Majestio @ ConEmu мимо. Им одна дорога в виртуальные машины, где-нибудь рядышком с DOS/Win9X. Пользователям 8,7, Vista одна дорога ConEmu. |
|
Сообщ.
#11
,
|
|
|
|
Цитата Qraizer @ Достаточно? Ну так вроде норм. Скинь exe-шник в архиве чисто у себя заценить. Добавлено Цитата Qraizer @ ConEmu мимо. Им одна дорога в виртуальные машины, где-нибудь рядышком с DOS/Win9X. Не, я только что на 7-ке проверил. ConEmu заинсталлился и норм запустился. Более того - в настройках видны все установленные шрифты, в том числе и этот Unifont. А вот стандартный cmd.exe видит только Consolas и Lucida Console |
|
Сообщ.
#12
,
|
|
|
|
А чем тебя сырец не устраивает собрать?
Консоль, не секрет, не обязательно, что поддерживает весь юникод. Всё ж у неё собственный рендер, к тому же скорее всего не рассчитанный на пропорциональные шрифты. Так что с Unifont-ом в консоли я, вероятно, перегнул. Но факт, что UTF в отличие от UCS, у неё в архитектуре исходно не были заложены. См. мои претензии ранее в какой-то теме про абстракцию "символ". Переархитектурить довольно глубоко интегрированный в ОСь компонент на UTF дорогого стоило. Ну и да, см. мои претензии ранее в какой-то теме про архитектуру юникода С его дурацкими суррогатными точками не в последнюю очередь. |
|
Сообщ.
#13
,
|
|
|
|
Цитата Qraizer @ Какой-такой терминал-шмитернал... стандартный CMD В общем, задурил ты мне голову этим старым корявым виндовым терминалом Пришлось разбираться. Обычное окно cmd.exe использует старый GDI-рендерер (через conhost.exe), который: Поэтому, если символа нет в выбранном шрифте - cmd.exe просто не может подставить его из другого TTF-файла, в отличие от графических приложений. К примеру JetBrains Mono и Consolas просто не содержат эти эмодзи и декоративные значки, поэтому cmd.exe их пропускает или заменяет квадратиками. Почему Unifont и SimSun работают Эти шрифты: Поэтому cmd.exe использует их напрямую и может отрисовать все символы. Почему ConEmu всё показывает красиво ConEmu (и также Windows Terminal, Alacritty и т. п.) не использует старый GDI-рендерер, а рисует текст: Именно поэтому ConEmu с тем же шрифтом JetBrains Mono отображает строку корректно — он автоматически подставляет глифы из других шрифтов, в то время как cmd.exe этого делать не умеет. Ну и какое резюме? "хватит на винду наезжать"? Unifont и SimSun - корявые и убогие костыли. |
|
Сообщ.
#14
,
|
|
|
|
Цитата Majestio @ Ну и какое резюме? Резюме: автору надо прожать вопрос решён, а вам переехать в профильный раздел для махача на тему терминалов |
|
Сообщ.
#15
,
|
|
|
|
|