Вывод символов Юникода в терминале Windows

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

Я использую:

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

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

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

// 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-символам. Но было бы здорово иметь полный набор символов Юникода для игры.

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


Изменить:

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


person Martin Nycander    schedule 12.11.2009    source источник
comment
Вы читали книгу Спольски «Абсолютный минимум, который обязательно должен знать каждый разработчик программного обеспечения о Unicode и наборах символов (без оправданий!)?» Очевидно, вы должны прочитать это, прежде чем сделать следующий вдох, если вы работаете с наборами символов: joelonsoftware. com/articles/Unicode.html   -  person Ben McCormack    schedule 12.11.2009
comment
У меня есть некоторый опыт работы с наборами символов, но я не читал эту конкретную статью. проверю, спасибо за подсказку :)   -  person Martin Nycander    schedule 12.11.2009


Ответы (4)


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

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

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

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

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

person McDowell    schedule 12.11.2009
comment
Я еще не пробовал создавать ссылку на Shell, так как нам нужно было бороться с некоторыми ошибками. Но этот ответ хорошо отвечает на мои вопросы. Спасибо :) - person Martin Nycander; 16.11.2009

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

person JSBձոգչ    schedule 12.11.2009
comment
Должен ли я полагаться на пользователя, чтобы сделать это? Или я могу принудительно изменить шрифт внутри приложения? - person Martin Nycander; 12.11.2009
comment
+1, это действительно был сценарий, хотя решение работает только на машине-разработчике:/ - person Martin Nycander; 13.11.2009

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

person Aaron    schedule 12.11.2009
comment
Мне не нравится использовать методы, специфичные для платформы, но я пытался использовать SetConsoleCP(65001); для получения UTF-8... не сработало. - person Martin Nycander; 13.11.2009

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

person CodexArcanum    schedule 23.01.2012