如何使ncurses显示与cout类似的特殊字符 我一直在用C++编写程序,并决定使用咒语是一个更好的方法来做事情(让事物跨平台)。它基本上工作正常,但有一个问题。在我的原始代码中,每当我编写std::cout

如何使ncurses显示与cout类似的特殊字符 我一直在用C++编写程序,并决定使用咒语是一个更好的方法来做事情(让事物跨平台)。它基本上工作正常,但有一个问题。在我的原始代码中,每当我编写std::cout,c++,ncurses,C++,Ncurses,时,您都依赖于特定的代码页或字符集。解决这个问题的可移植方法是使用宽字符和Unicode等效字符。试试这个: #include <iostream> #include <locale> int main() { constexpr wchar_t uptriangle = L'\u25B2'; std::locale::global(std::locale("")); std::wcout.imbue(std::locale()); std::wcou

时,您都依赖于特定的代码页或字符集。解决这个问题的可移植方法是使用宽字符和Unicode等效字符。试试这个:

#include <iostream>
#include <locale>

int main()
{
  constexpr wchar_t uptriangle = L'\u25B2';

  std::locale::global(std::locale(""));
  std::wcout.imbue(std::locale());
  std::wcout << uptriangle << std::endl;

  return 0;
}
#包括
#包括
int main()
{
constexpr wchar_t uptriangle=L'\u25B2';
std::locale::global(std::locale(“”);
std::wcout.imbue(std::locale());

std::wcout包含和支持的宽字符调用,通常支持UTF-8编码。如果您使用的是“ncurses”库,则很可能存在用于相同平台的“ncursesw”(即使是mingw,似乎也忽略了构建/提供:例如,指令省略了
--启用widec
选项)


该函数只接受8位字符值。您的参数不适合8位值。ncurses(与X/Open不同)允许将8位值序列传递给
addch
,并解释为多字节字符(如UTF-8).

我认为
ncurses
通过发出一个转义序列来完成它的职责,以确保你要求它做的事情实际发生——但不幸的是,你没有使用它期望写入的显示方法,而你实际使用的显示方法也不理解序列。p.s.我认为
std::没有这个问题原因是windows命令行不能正常工作(默认情况下根本不能工作)使用unicode。而且,ncurses甚至不接受
wchar\u t
s作为可接受的输出形式。就我个人而言,我觉得最好的办法是让程序使用特定的代码页,但我不知道如何做到这一点。@sudgy支持宽字符的ncurses版本是ncursesw(该接口标准化为X/Open Curses的扩展).Windows和MSVC的现代版本应支持
std::wcout
。有关如何将Windows代码页更改为UTF-8的说明,请参阅此处。我不建议在新程序中使用任何其他代码页。我不希望必须更改注册表才能使代码正常工作,我希望代码完全自包含。我知道终端接受这些字符。代码页437包含了我所需要的一切,我认为setlocale()和一些ncurses函数的组合应该是我所需要的。如果不对系统本身进行任何更改,真的没有办法使代码兼容不同的系统吗?