如何使ncurses显示特殊字符与cout如何显示

时间:2015-10-18 04:10:24

标签: c++ ncurses

我一直在用c ++编写程序,并决定使用curses是一种更好的做事方式(使事情跨平台)。它大部分工作正常,但有一个问题。在我的原始代码中,每当我写std::cout << char(30)时,它都会输出。我在程序的一部分中使用了这个。现在,当我使用addch(char(30))时,它会写^[something I don't know because it's overwritten by something else]

我一直在寻找如何解决这个问题。人们说诅咒包含的一些特殊字符,但它们都不是我想要的。人们说我应该尝试使用-lncursesw,但我的编译器找不到它。我知道这是一个unicode角色,但为什么我之前能够使用呢?

我在Windows上使用mingw64来编译我的代码。只要它是跨平台的,我可以通过许多不同的方法来修复它。我可以尝试找到一些使unicode工作的方法(但事实是我不能使用-lncursesw似乎说我不能)。我可以包括一个字符表,但我不知道如何做到这一点或如何使诅咒使用它。最后,我只想知道:我如何使用cout通常可以使用的这些特殊字符?

2 个答案:

答案 0 :(得分:0)

您依赖于特定的代码页或字符集。解决此问题的可移植方法是使用宽字符和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;
}

您需要在支持UTF-8的版本中使用宽字符版本的ncurses或输出u8"\u2582",例如Windows代码为65001或Unix为UTF8语言环境。

答案 1 :(得分:0)

ncurses支持的广泛字符调用包括wadd_wchwaddwstr,它们通常支持UTF-8编码。如果您正在使用&#34; ncurses&#34;图书馆,很可能有一个&#34; ncursesw&#34;对于同一平台(即使是mingw,虽然this page似乎忽略了构建/提供:例如,省略了--enable-widec选项。

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