如何在C ++中输出unicode框图?

时间:2019-03-22 14:40:22

标签: c++ unicode visual-studio-2017

很抱歉,听起来似乎很简单,但我试图使用下面的代码,使用https://en.wikipedia.org/wiki/Box-drawing_character中的unicode字符在Visual Studio 2017中绘制一个简单的框

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

以此类推...

但是,每当我运行它时,以上所有代码都简单地输出为??哪里应该有一条线。

那么是否可以将这样的代码直接输出到控制台,或者我必须为每个字符写每个字符的数字值?

2 个答案:

答案 0 :(得分:1)

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;
}

还要在控制台设置中检查您的控制台font。您可能需要光栅字体,但这也适用于Consolas。

如果您需要控制台io流,它可以与unicode以及盒驱动一起使用,则可以使用my library

答案 1 :(得分:0)

如果模式设置正确,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”进行编译。输出为:

┏━━━━━━━━━━━━━━━━━┓
┃