На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Настройка консоли на отображение Unicode
    Здрааствуйте!
    Подскажите, пожалуйста, как сделать чтобы в Консоли отображались вот такие значки?:
    Символы: ❌ ✅ ⚡ ♥ ♦ ♣ ♠ ★ ☆ ☀ ☁ ☂ ☃"
    Широкие символы:
      Цитата DDim1000 @

      Найдите моноширинный шрифт который их содержит и поставьте для отображения в консоли.
      Сообщение отредактировано: sharky72 -
        Цитата sharky72 @
        Цитата DDim1000 @

        Найдите моноширинный шрифт который их содержит и поставьте для отображения в консоли.

        Как это сделать?
          Цитата DDim1000 @

          Что? Найти шрифт или настроить его в консоли? Какой консоли? старой или новой (Win11)? Дать вам ссылку как посмотреть и установить настройки по умолчанию для консоли Windows? Если что это к теме c++ не имеет отношения, скорее к настройкам ОС

          Может проще вам отказаться от консоли и сделать нормальный UI?
          Сообщение отредактировано: sharky72 -
            Если очень хочется, то в винде подходящим для указанных символов шрифтом будет "SimSun". Есть ещё его вариации. Установить кодовую страницу SetConsoleOutputCP() уже советовали, установить шрифт можно SetCurrentConsoleFontEx(). Только вот зачем всё это?
              [:offtop:] Кстати вот, подумалось вдруг. Дум на чём только не запускали. Даже для консоли есть ASCII-артовый рендер. Почему никто не догадался написать рендер в фонт? Даже цвет можно добавить... [/:offtop:]
                Цитата DDim1000 @
                Здрааствуйте!
                Подскажите, пожалуйста, как сделать чтобы в Консоли отображались вот такие значки?:
                Символы: ❌ ✅ ⚡ ♥ ♦ ♣ ♠ ★ ☆ ☀ ☁ ☂ ☃"
                Широкие символы:


                В стандартной виндовой - никак!

                Но можно вместо нее использовать ConEmu. Вот пример, как может выглядеть редактор Far'а:

                Прикреплённая картинка
                Прикреплённая картинка


                Шрифт установлен Jet Brains Mono. Но Courier, Consolas тоже норм отображают. Остальные моноширинные просто не смотрел. Хотя "моноширинность" для emoji - мягко говоря, так себе.
                  Majestio, хватит на винду наезжать. Чай не первый раз уже.
                  ExpandedWrap disabled
                    #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 тоже можно поставить. Рекомендую.
                  Сообщение отредактировано: Qraizer -
                    Цитата Qraizer @
                    Majestio, хватит на винду наезжать. Чай не первый раз уже.

                    Ну ок, скинь тогда скрин вывода emoji в стандартном виндовом терминале, вот как я постом выше.

                    ChatGPT разъяснил ситуацию ;)

                    • ConEmu — используют современную графику → поддерживают все Unicode-символы.
                    • Классический conhost.exe — использует устаревший 16-битный буфер → не поддерживает emoji и символы > U+FFFF, даже с chcp 65001.

                    Кстати, попробовал новый виндовый терминал - там тоже норм. Но он входит в состав Windows начиная с Windows 10 (build 18309) и Windows 11.
                    Так что можно сказать, что это не стандартная, а дополнительная фича. Пользователям 8,7, Vista одна дорога ConEmu.

                    Вот как выглядит редактор Far'а, запущенного в Windows Terminal:

                    Прикреплённая картинка
                    Прикреплённая картинка
                      Цитата Majestio @
                      Ну ок, скинь тогда скрин вывода emoji в стандартном виндовом терминале, вот как я постом выше.
                      Какой-такой терминал-шмитернал... стандартный CMD
                      Прикреплённая картинка
                      Прикреплённая картинка

                      Достаточно?

                      Добавлено
                      Цитата Majestio @
                      Пользователям 8,7, Vista одна дорога ConEmu.
                      ConEmu мимо. Им одна дорога в виртуальные машины, где-нибудь рядышком с DOS/Win9X.
                      Сообщение отредактировано: Qraizer -
                        Цитата Qraizer @
                        Достаточно?

                        Ну так вроде норм. Скинь exe-шник в архиве чисто у себя заценить.

                        Добавлено
                        Цитата Qraizer @
                        ConEmu мимо. Им одна дорога в виртуальные машины, где-нибудь рядышком с DOS/Win9X.

                        Не, я только что на 7-ке проверил. ConEmu заинсталлился и норм запустился.
                        Более того - в настройках видны все установленные шрифты, в том числе и этот Unifont.
                        А вот стандартный cmd.exe видит только Consolas и Lucida Console
                          А чем тебя сырец не устраивает собрать?
                          Консоль, не секрет, не обязательно, что поддерживает весь юникод. Всё ж у неё собственный рендер, к тому же скорее всего не рассчитанный на пропорциональные шрифты. Так что с Unifont-ом в консоли я, вероятно, перегнул. Но факт, что UTF в отличие от UCS, у неё в архитектуре исходно не были заложены. См. мои претензии ранее в какой-то теме про абстракцию "символ". Переархитектурить довольно глубоко интегрированный в ОСь компонент на UTF дорогого стоило. Ну и да, см. мои претензии ранее в какой-то теме про архитектуру юникода :D С его дурацкими суррогатными точками не в последнюю очередь.
                          Сообщение отредактировано: Qraizer -
                            Цитата Qraizer @
                            Какой-такой терминал-шмитернал... стандартный CMD

                            В общем, задурил ты мне голову этим старым корявым виндовым терминалом :-?

                            Пришлось разбираться. Обычное окно cmd.exe использует старый GDI-рендерер (через conhost.exe), который:

                            • работает только с моноширинными шрифтами (в понимании Windows, а не просто визуально)
                            • не умеет fallback на другие шрифты, если символа нет в текущем
                            • не поддерживает большинство символов вне базовой латиницы и Windows-1252/1251 диапазона

                            Поэтому, если символа нет в выбранном шрифте - cmd.exe просто не может подставить его из другого TTF-файла, в отличие от графических приложений.
                            К примеру JetBrains Mono и Consolas просто не содержат эти эмодзи и декоративные значки, поэтому cmd.exe их пропускает или заменяет квадратиками.

                            Почему Unifont и SimSun работают

                            Эти шрифты:

                            • содержат почти весь Unicode диапазон (в частности символы U+2600–U+26FF, U+2700–U+27BF)
                            • официально моноширинные с точки зрения Windows (фиксированная метрика)
                            • корректно регистрируются как шрифты консоли (в HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont)

                            Поэтому cmd.exe использует их напрямую и может отрисовать все символы.

                            Почему ConEmu всё показывает красиво

                            ConEmu (и также Windows Terminal, Alacritty и т. п.) не использует старый GDI-рендерер, а рисует текст:

                            • через DirectWrite / Uniscribe,
                            • с фолбэком шрифтов — т.е. если JetBrains Mono не содержит символ ⚡, он берёт его, например, из Segoe UI Symbol или Noto Color Emoji.

                            Именно поэтому ConEmu с тем же шрифтом JetBrains Mono отображает строку корректно — он автоматически подставляет глифы из других шрифтов, в то время как cmd.exe этого делать не умеет.

                            Ну и какое резюме? "хватит на винду наезжать"? :lol: Unifont и SimSun - корявые и убогие костыли.
                              Цитата Majestio @
                              Ну и какое резюме?

                              Резюме: автору надо прожать вопрос решён, а вам переехать в профильный раздел для махача на тему терминалов ;)
                                :D
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0482 ]   [ 20 queries used ]   [ Generated: 14.12.25, 04:59 GMT ]