【问题标题】:How to output unicode box drawing in C++?如何在 C++ 中输出 unicode 方框图?
【发布时间】:2019-03-22 14:40:22
【问题描述】:

对不起,这听起来很简单,但我正在尝试使用来自 https://en.wikipedia.org/wiki/Box-drawing_character 的 unicode 字符在 Visual Studio 2017 中使用下面的代码绘制一个简单的框

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

等等……

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

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

【问题讨论】:

  • 无论你输出什么,都必须知道编码和字符集。
  • 您必须明白,编写代码时使用的字符集和编码与运行程序时使用的字符集和编码不同。
  • 您的终端窗口不支持您要打印的字符。此代码适用于我的 Fedora 29 上的 Gnome 终端。我不知道如何在 Windows 中执行此操作

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


【解决方案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 以及 box driwing 一起使用,您可以使用 my library

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 2013-07-12
    • 2017-03-14
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多