如何使用方框绘制字符作为Ncurses窗口的边框
WSL2 + Windows Terminal下Ncurses边框显示异常的解决
问题描述
在Windows 10系统中使用WSL2与Windows Terminal,通过以下C++代码尝试用方框绘制字符作为Ncurses窗口边框时,输出不符合预期:
#include <ncurses.h> int main() { initscr(); int height, width; int positionX, positionY; height = 10; width = 20; positionX = 0; positionY = 0; WINDOW * win = newwin(height, width, positionX, positionY); refresh(); cchar_t verticalLine; /* setcchar(); */ /* curs_getcchar(); */ setcchar(&verticalLine, L"│", 0, 0, nullptr); cchar_t horizontalLine; setcchar(&horizontalLine, L"─", 0, 0, nullptr); cchar_t tlc, trc, brc, blc; setcchar(&tlc, L"u", 0, 0, nullptr); setcchar(&trc, L"u", 0, 0, nullptr); setcchar(&blc, L"u", 0, 0, nullptr); setcchar(&brc, L"u", 0, 0, nullptr); wborder_set(win, &verticalLine, &horizontalLine, &verticalLine, &verticalLine, &tlc, &trc, &blc, &brc); wrefresh(win); getch(); endwin(); }
终端输出情况如下:
问题原因
- 宽字符支持未启用:未设置locale,Ncurses无法正确处理UTF-8编码的方框字符
- wborder_set参数顺序错误:该函数参数顺序为
wborder_set(win, 左竖线, 右竖线, 上横线, 下横线, 左上角色, 右上角色, 左下角色, 右下角色),原代码将右竖线错误设置为横线字符 - 边框角色符错误:四个角的字符被设置为
u,而非正确的方框角字符(┌、┐、└、┘) - 编译链接库错误:使用宽字符函数时需链接
ncursesw库,而非默认的ncurses
解决方法
1. 配置UTF-8环境
- 在Windows Terminal中,进入WSL配置页面,将“编码”设置为UTF-8
- 或在WSL终端执行命令:
export LC_ALL=en_US.UTF-8,确保环境变量使用UTF-8编码
2. 修正代码
添加locale设置,调整参数顺序与角色符:
#include <ncurses.h> #include <locale.h> int main() { // 启用宽字符支持,必须在initscr前调用 setlocale(LC_ALL, ""); initscr(); int height = 10; int width = 20; int positionX = 0; int positionY = 0; WINDOW *win = newwin(height, width, positionX, positionY); refresh(); cchar_t verticalLine; setcchar(&verticalLine, L"│", 0, 0, nullptr); // 竖线字符 cchar_t horizontalLine; setcchar(&horizontalLine, L"─", 0, 0, nullptr); // 横线字符 cchar_t tlc, trc, blc, brc; setcchar(&tlc, L"┌", 0, 0, nullptr); // 左上角 setcchar(&trc, L"┐", 0, 0, nullptr); // 右上角 setcchar(&blc, L"└", 0, 0, nullptr); // 左下角 setcchar(&brc, L"┘", 0, 0, nullptr); // 右下角 // 按正确顺序传入参数 wborder_set(win, &verticalLine, &verticalLine, &horizontalLine, &horizontalLine, &tlc, &trc, &blc, &brc); wrefresh(win); getch(); endwin(); return 0; }
3. 正确编译代码
编译时链接ncursesw库:
g++ border.cpp -o border -lncursesw
内容的提问来源于stack exchange,提问作者rafid100
相关产品推荐
相关产品推荐

