Как вывести Unicode Box рисунок в C ++? - PullRequest
2 голосов
/ 22 марта 2019

Извините за то, что может показаться простым, но я пытаюсь нарисовать простую рамку в Visual Studio 2017, используя символы Юникода из https://en.wikipedia.org/wiki/Box-drawing_character, используя код ниже

#include <iostream>
using namespace std;
int main()
{
cout << "┏━━━━━━━━━━━━━━━━━┓" << endl;
cout << "┃" << endl;

и т. Д.on ...

Однако, когда я запускаю его, весь приведенный выше код просто выводится как?везде, где должна быть строка.

Так возможно ли выводить код, подобный этому, непосредственно на консоль или для каждого символа нужно ли записывать числовые значения для каждого символа?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Консоль Windows поддерживает UTF-16LE UNICODE.

Вы можете использовать некоторую библиотеку для управления коробками, например, PDCurses .

В противном случае вы можете использовать следующий подход

#include <windows.h>
#include <cwchar>

class output_swap {
    output_swap(const output_swap&) = delete;
    output_swap operator=(output_swap&) = delete;
public:
    output_swap( ) noexcept:
        prevCP_( ::GetConsoleCP() )
    {
        ::SetConsoleCP( CP_WINUNICODE );
        ::SetConsoleOutputCP( CP_WINUNICODE );
    }
    ~output_swap() noexcept {
        ::SetConsoleCP( prevCP_ );
        ::SetConsoleOutputCP( prevCP_ );
    }
private:
    ::DWORD prevCP_;
};

void draw_text(const wchar_t* text)
{
  static ::HANDLE _out = ::GetStdHandle(STD_OUTPUT_HANDLE);
  ::DWORD written;
  ::WriteConsoleW( _out, text, std::wcslen(text), &written, nullptr );
}

int main(int argc, const char** argv) {
   output_swap swap;
   draw_text(L"┏━━━━━━━━━━━━━━━━━┓\n");
   draw_text(L"┃        OK       ┃\n");
   draw_text(L"┗━━━━━━━━━━━━━━━━━┛\n");
   return 0;
}

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

Если вам нужны консольные потоки ввода-вывода, которые могут работать как с юникодом, так и с переадресацией блоков, вы можете использовать моя библиотека

0 голосов
/ 23 марта 2019

Консольные приложения Windows могут выводить широкие строки (L"...") непосредственно на терминал, если режим установлен правильно. Обратите внимание на использование wcout. Сохраните следующий источник в кодировке UTF-8:

#include <iostream>
#include <io.h>
#include <fcntl.h>

using namespace std;

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    wcout << L"┏━━━━━━━━━━━━━━━━━┓" << endl;
    wcout << L"┃" << endl;
}

Скомпилируйте с помощью "cl / EHsc / utf-8 test.cpp". Выход:

┏━━━━━━━━━━━━━━━━━┓
┃
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...