You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C语言结合ncurses无法打印UTF-8字符,输出乱码求助

解决ncursesw输出UTF-8字符的问题

你的核心问题是用错了字符输出函数,addch是针对单字节ASCII字符的接口,无法正确处理Unicode宽字符,导致码点被截断成错误的ASCII字符。结合你的代码,按以下步骤修改即可解决:

关键修改点

  • 替换宽字符输出函数:把addch(9617)换成ncursesw的宽字符输出接口,比如waddch或add_wch。9617是Unicode码点U+2597(▗),需要用宽字符表示,比如L'▗'或者(wchar_t)0x2597。
  • 确保使用ncursesw头文件:直接包含<ncursesw/ncurses.h>而非普通的curses.h,避免混用窄字符版本的接口。
  • 验证Locale生效:虽然代码里调用了setlocale(LC_ALL, ""),要确认终端的环境变量(比如LANG)设置为UTF-8格式(如zh_CN.UTF-8、en_US.UTF-8),否则Locale不会正确加载。

修改后的完整代码

#include <ncursesw/ncurses.h>
#include <wchar.h>
#include <locale.h>
#include <stdint.h>

#define unsetcolor(color) attroff(COLOR_PAIR(color))
#define to_full_color(f, b) (b << 3) | f | 64
#define setcolor(color) attron(COLOR_PAIR(color))

void init_colorpairs()
{
    for(int f = 0; f < 8; f++)
    {
        for(int b = 0; b < 8; b++)
        {
            int color_pair = to_full_color(f, b);
            init_pair(color_pair, f, b);
        }
    }
}

int main()
{
    if (setlocale(LC_ALL, "") == NULL) {
        fprintf(stderr, "Failed to set locale\n");
        return 1;
    }

    WINDOW* main_win = initscr();
    if(has_colors() == FALSE)
    {
        endwin();
        fprintf(stderr, "Terminal does not support colors\n");
        return -1;
    }
    start_color();
    init_colorpairs();

    int win_s_x, win_s_y;
    getmaxyx(main_win, win_s_y, win_s_x);
    
    attron(A_BOLD);

    for(int i = 0; i < (win_s_x * win_s_y); i++)
    {
        uint8_t color = (i&63)|64;
        setcolor(color);
        // 使用宽字符输出函数打印U+2597
        waddch(main_win, (wchar_t)0x2597);
        unsetcolor(color);
    }
    refresh();
    attroff(A_BOLD);
    
    getch();
    endwin();
    return 0;
}

编译与运行

保持原来的编译命令:

cc main.c -lncursesw

运行前确认终端Locale为UTF-8,可通过echo $LANG检查,若不是则临时设置:

export LANG=en_US.UTF-8

内容的提问来源于stack exchange,提问作者usernameisunavaible

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:20:34