我如何保证终端具有 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_ACS
ncurses(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/C++ 中编写“真正的”交互式终端程序,如 vim、htop、...
如果在终端上运行,Ncurses 输出的“sl”会发生变化吗?