我正在为一个小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
中运行程序时,我需要抛出一个错误。
答案 0 :(得分:1)
你做不到。 ncurses(w)使用termcap来确定终端具有哪些功能,并查看TERM=xterm
环境变量以确定正在使用的终端。该变量没有特殊值表明终端支持Unicode; XTerm和UXTerm都设置为$TERM
。许多其他终端应用程序也使用ACS_*
的值,包括支持Unicode的那些和不支持Unicode的那些。 (实际上,在许多终端仿真器中,可以在运行时启用和禁用Unicode支持。)
如果你想开始输出Unicode文本到终端,你只需要相信用户终端会支持它。
如果您只想输出框图纸字符,则可能根本不需要Unicode - 这些字符作为VT100图形字符集的一部分提供。您可以使用ACS_ULCORNER
常量在ncurses应用程序中输出这些字符(例如,┌
为SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2260048 bytes
Variable Size 675283888 bytes
Database Buffers 385875968 bytes
Redo Buffers 5517312 bytes
Database mounted.
SQL> alter database clear logfile group 2;
Database altered.
SQL> alter database open;
Database altered.
SQL>
),或使用box()
之类的函数为您绘制更大的数字
答案 1 :(得分:1)
如上所述,您无法可靠地检测终端的功能。就此而言,您无法检测终端对颜色的支持。在任何一种情况下,您的应用程序只能检测您配置的内容,这不是一回事。
有些人通过编写UTF编码的字符并使用光标位置报告来查看光标所在位置(参见例如 Detect how much of Unicode my terminal supports, even through screen ),部分成功地检测到了Unicode支持。
使用 ncursesw 进行编译/链接依赖于正确配置您的语言环境,以及在UTF-8模式下不支持VT100线路图形的终端(例如PuTTY)的一些变通方法。
进一步阅读:
NCURSES_NO_UTF8_ACS
ncurses(3x)