如何在C 中输出Unicode框

How to output unicode box drawing in C++?

本文关键字:输出 Unicode      更新时间:2023-10-16

对不起,听起来很简单,但是我试图使用https://en.wikipedia.org/wiki/box的Unicode字符在Visual Studio 2017中绘制一个简单的盒子-drawing_character使用以下代码

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

等等...

但是,每当我运行上述所有代码时,只需输出作为a吗?任何应该有线路的地方。

因此,可以将像这样的代码直接输出到控制台还是每个字符我必须为每个字符编写数字值?

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。

如果您需要控制台IO流,可以与Unicode一起使用,并且可以使用我的库

使用我的库

Windows Console应用程序如果正确设置该模式,可以将宽字符串(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"编译。输出为:

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