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

时间:2016-02-11 02:55:44

标签: c unicode terminal ncurses widechar

我正在为一个小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中运行程序时,我需要抛出一个错误。

2 个答案:

答案 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)的一些变通方法。

进一步阅读: