使用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
相关产品推荐
相关产品推荐

