Вывод символов юникода в терминале Windows - PullRequest
6 голосов
/ 12 ноября 2009

На прошлой неделе я вместе с другом работал над roguelike игрой на C ++. В основном тоже учить язык.

Я использую:

  • pdcurses
  • Windows 7
  • Визуальная студия C ++

Для вывода wchar_t в консоли. Мне удалось отключить некоторые символы Юникода, такие как \ u263B (☻), но другие, такие как \ u2638 (☸), будут просто в виде вопросительных знаков (?).

Вот соответствующий код, который я использую для вывода.

// Container of room information

struct RoomInfo
{
    wchar_t * layout;
    int width;
    int height;
};

// The following function builds RoomInfo 

RoomInfo Room::examine(IActor * examinor)
{
    RoomInfo ri;
    ri.width = this->width;
    ri.height = this->height;
    ri.layout = new wchar_t[height * width];
    for(unsigned int y = 0; y < height; y++)
    {
        for(unsigned int x = 0; x < width; x++)
        {
            ri.layout[y*width + x] = L'\u263B'; // works
            //ri.layout[y*width + x] = L'\u2638'; // will not work
        }
    }
}

// The following function outputs RoomInfo

void CursesConsole::printRoom(RoomInfo room)
{
    int w = room.width;
    int h = room.height;

    WINDOW * mapw = newwin(h, w, 1, 0);
    for(int y = 0; y < h; y++)
    {
        wmove(mapw, y, 0);
        for(int x = 0; x < w; x++)
        {
            int c = y*w + x;
            waddch(mapw, room.layout[c]);
        }
    }

    wrefresh(mapw);
    delwin(mapw);
}

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

Подводя итог: Как убедиться, что символы Юникода выводятся правильно?


Редактировать:

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

Ответы [ 4 ]

2 голосов
/ 12 ноября 2009

Вам необходимо правильно установить кодовую страницу. Об этом есть довольно хорошая статья: ссылка

2 голосов
/ 13 ноября 2009

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

Я искал это, но не смог найти вызов Windows API для этого (что, конечно, может означать, что я его не нашел). Я не ожидал бы найти кроссплатформенный способ сделать это.

Лучшее решение, которое я могу придумать, - запустить консоль, используя специально созданный файл Shell Link (.LNK). Если вы прочтете документацию формата , вы увидите, что она позволяет вам указать шрифт.

Но ваши проблемы на этом не заканчиваются. Для Windows, установленной в западной локали, Lucida Console предоставляется, но этот шрифт предоставляет только ограниченный набор графем. Я предполагаю, что вы можете выводить / вводить японский текст в консоли на японском ПК с Windows. Вам нужно проверить, что доступно на японской Windows, если вы хотите быть уверенным, что она будет работать там.

Linux (по крайней мере, Ubuntu), похоже, имеет гораздо лучшую поддержку, используя UTF-8 и предоставляя шрифт с широкой поддержкой графем. Я не проверял другие дистрибутивы, чтобы узнать, что это за история, и не проверял, как шрифты разрешаются в терминале (будь то X, Gnome или что-то еще).

2 голосов
/ 12 ноября 2009

В принципе, все символы Юникода поддерживаются на консоли. Тот факт, что вы видите знаки вопроса, вероятно, связан с поддержкой шрифтов для этих символов. Попробуйте переключить консольный шрифт на что-то с очень хорошей поддержкой юникода.

1 голос
/ 23 января 2012

Хотя это довольно большой переключатель, вы можете попробовать использовать альтернативную консоль, особенно если вы делаете roguelike. libtcod - это умеренно популярная библиотека, написанная на C с привязками C ++, которая предоставляет полноцветную консоль, в которой вы можете настроить свои собственные шрифты и глифы. Это должно дать вам гораздо большую гибкость, чем застревание с что дает вам консоль Windows.

...