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



我正在开发一个NCURSES应用程序,用于一些TUI(文本用户界面(练习。不幸的是,我无法选择使用如此美妙和忠实的ASCII。我的程序使用了很多Unicode框绘图字符。

我的程序已经可以检测终端是否具有颜色功能。我需要执行以下操作:

if(!supportsUnicode()) //I prefer camel-case, it's just the way I am.
{
    fprintf(stderr, "This program requires a Unicode-capable terminal.nr");
    exit(1);
}
else
{
    //Yay, we have Unicode! some random UI-related code goes here.
}

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

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

有些人通过编写 UTF 编码字符并使用光标位置报告查看光标的位置,在检测 Unicode 支持方面取得了部分成功(例如,请参阅检测我的终端支持多少 Unicode,即使通过屏幕也是如此(。

使用 ncursesw 进行编译/链接依赖于正确配置您的语言环境,对于在 UTF-8 模式下不支持 VT100 行图形的终端(例如 PuTTY(,有一些解决方法。

延伸阅读:

  • 线条图形curs_add_wch(3x(
  • NCURSES_NO_UTF8_ACS ncurses(3x(

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

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

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

nl_langinfo() 函数应返回指向字符串的指针,该字符串包含与当前区域设置中定义的特定语言或文化区域相关的信息。

#include <langinfo.h>
#include <locale.h>
#include <stdbool.h>
#include <string.h>
bool supportsUnicode()
{
        /* Set a locale for the ctype and multibyte functions.
         * This controls recognition of upper and lower case,
         * alphabetic or non-alphabetic characters, and so on.
         */
        setlocale(LC_CTYPE, "en_US.UTF-8");
        return (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) ? true : false;
}

参考 htop 源代码,它可以在有/没有 Unicode 的情况下绘制线条。

最新更新