首页 > 解决方案 > 带有 ncurses 的 C99 UTF8 字符

问题描述

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

在此处输入图像描述

如您所见,我想要的字符显示为~H.

我按照类似问题的说明进行了发球。最小的工作示例:

#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,并且我使用的是完全能够显示 utf8 的吸盘终端:

st utf8 演示

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

标签: cunicodeutf-8c99ncurses

解决方案


手册页简要概述了用于函数参数的数据类型。

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

  • mvaddch函数使用 a chtype,它与 不同wchar_t
  • 对应的 curses 函数mvaddchmvadd_wch,它使用了第三种类型 ( cchar_t)。
  • 您可以将该宽字符转换为cchar_tusing setcchar,或者
  • 您可以将值存储在数组中并将其wchar_t传递mvaddwstr

推荐阅读