带有 ncurses 的 C99 UTF8 字符

C99 UTF8 characters with ncurses

我正在尝试 ncurses 并且遇到了问题。我想用 Unicode 块字符 (U+2588, █) 绘制一个简单的框,但我无法正确显示它:

如你所见,我要的字符显示为~H

我按照 a similar question 的说明进行了发球。最小工作示例:

#include <locale.h>
#include <ncurses.h>

int main() {
    setlocale(LC_ALL, ""); // must be caled before initscr
    WINDOW *win = initscr();

    int w, h;
    getmaxyx(win, h, w);
    
    // should fill the left half of the 
    // terminal window with filled block characters
    int i, j;
    for (i = 0; i < h; i++) {
        for (j = 0; j < w/2; j++) {
            mvaddch(x, y, L'\u2588');
        }
    }

    refresh(); // show changes
    getch();   // wait for user input
    endwin();  // kill window
    
    return 1;
}

编译:

gcc main.c -o main -std=c99 -lncurses

我的 PC 语言环境是 en_US.UTF-8,我使用的是 suckless 终端,当然是 perfectly capable of dislaying utf8:

这是一个非常简单的程序,我不确定这里出了什么问题。有什么建议吗?

手册页给出了一个short overview of data-types,用于函数参数。

在示例中,L'\u2588' 是一个 宽字符 ,它将存储在 wchar_t 中类型。

  • mvaddch函数使用了一个chtype,与wchar_t.
  • 不一样
  • 对应mvaddch的curses函数是mvadd_wch,它使用了第三种类型(cchar_t)。
  • 您可以使用 setcchar
  • 宽字符 转换为 cchar_t
  • 您可以将值存储在 wchar_t 数组中,然后将 that 传递给 mvaddwstr.