我如何保证终端具有 NCURSES 的 Unicode/宽字符支持?

Posted

技术标签:

【中文标题】我如何保证终端具有 NCURSES 的 Unicode/宽字符支持?【英文标题】:How could I guarantee a terminal has Unicode/wide character support with NCURSES? 【发布时间】:2016-05-21 16:16:33 【问题描述】:

我正在为 TUI(文本用户界面)小练习开发 NCURSES 应用程序。不幸的是,我没有选择使用永远如此美妙和忠实的 ASCII。我的程序使用了很多 Unicode 方框图字符。

我的程序已经可以检测到终端是否具有颜色功能。我需要做类似的事情:

if(!supportsUnicode()) //I prefer camel-case, it's just the way I am.

    fprintf(stderr, "This program requires a Unicode-capable terminal.\n\r");
    exit(1);

else

    //Yay, we have Unicode! some random UI-related code goes here.

这不仅仅是简单地包含ncursesw 并设置区域设置的问题。我需要获取特定的终端信息,如果它不会发生,实际上会抛出一个错误。例如,当用户尝试在可爱的 XTerm 而不是支持 Unicode 的 UXTerm 中运行程序时,我需要抛出一个错误。

【问题讨论】:

【参考方案1】:

如上所述,您无法可靠地检测终端的功能。就此而言,您也无法检测到终端对颜色的支持。无论哪种情况,您的应用程序都只能检测到您已配置的内容,这不是一回事。

有些人通过编写 UTF 编码字符并使用光标位置报告查看光标的位置(例如参见 Detect how much of Unicode my terminal supports, even through screen),部分成功地检测到了 Unicode 支持。 p>

使用 ncursesw 编译/链接依赖于正确配置您的语言环境,并为在 UTF-8 模式下不支持 VT100 线图的终端(例如 PuTTY)提供一些解决方法。 p>

进一步阅读:

Line Graphicscurs_add_wch(3x) NCURSES_NO_UTF8_ACSncurses(3x)

【讨论】:

【参考方案2】:

你不能。 ncurses(w) 使用 termcap 来确定终端具有哪些功能,并查看 $TERM 环境变量来确定正在使用的终端。该变量没有表示终端支持 Unicode 的特殊值; XTerm 和 UXTerm 都设置为TERM=xterm。许多其他终端应用程序也使用 $TERM 的值,包括支持 Unicode 和不支持 Unicode 的应用程序。 (实际上,在许多终端仿真器中,可以在运行时启用和禁用 Unicode 支持。)

如果你想开始向终端输出 Unicode 文本,你只需要相信用户的终端会支持它。

如果您只想输出方框图字符,那么您可能根本不需要 Unicode — 这些字符可作为 VT100 图形字符集的一部分使用。您可以使用ACS_* 常量在 ncurses 应用程序中输出这些字符(例如,ACS_ULCORNER 用于),或使用类似box() 的函数为您绘制更大的图形。

【讨论】:

以上是关于我如何保证终端具有 NCURSES 的 Unicode/宽字符支持?的主要内容,如果未能解决你的问题,请参考以下文章

鼠标向上滚动(Ncurses / C++)

ncurses 库使用介绍: 实现终端 GUI

在没有 ncurses 的 C/C++ 中编写“真正的”交互式终端程序,如 vim、htop、...

如果在终端上运行,Ncurses 输出的“sl”会发生变化吗?

是否可以让 NCurses CDK 矩阵动态调整到终端窗口的大小?

C指针原理(29)-Ncurses-文本终端的图形