在ncurses中打印长unicode

在ncurses中打印长unicode,c,unicode,ncurses,C,Unicode,Ncurses,我需要在终端上为我的游戏打印一些unicode字符,有些像这样,\U0001F0A1,还有我的代码 #include <curses.h> #include <locale.h> int main(){ setlocale(LC_ALL, ""); initscr(); printw("\U0001F0A1"); getch(); endwin(); return 0; } #包括 #包括 int main(){ setl

我需要在终端上为我的游戏打印一些unicode字符,有些像这样,
\U0001F0A1
,还有我的代码

#include <curses.h>
#include <locale.h>
int main(){
    setlocale(LC_ALL, "");
    initscr();
    printw("\U0001F0A1");
    getch();
    endwin();
    return 0;
}
#包括
#包括
int main(){
setlocale(LC_ALL,“”);
initscr();
printw(“\U0001F0A1”);
getch();
endwin();
返回0;
}

打印出来的都是空白屏幕,但当我尝试使用printf时,它可以正常打印卡片。

可能的问题是:ncurses使用
wcwidth
确定字符的宽度,而
printf
不检查。计算机上的区域设置信息太旧,无法给出正确的结果

通过我的Debian测试,这是可行的(使用问题中给出的示例程序,编译/链接ncursesw)-请参见屏幕截图:

据了解,这来自Unicode 6.0(2010)。根据您使用的系统,例如Debian或Ubuntu,这可能是“最近的”


ncurses需要正确的
wcwidth
区域设置信息,而
printf
不使用wcwidth信息。如果您的区域设置信息太旧,
wcwidth
返回一个负值,告诉ncurses该字符未打印。在这种情况下,ncurses将显示一个空白。

Try
setlocale(LC_ALL,“en_US.UTF-8”)
printw(L“\U0001F0A1”)@sunqingyao我试过你的代码,但没有显示任何内容up@Morovaille帖子里的答案根本帮不上忙。我不太清楚你在说什么。你是说OP的系统可能支持,也可能不支持?还是说代码没问题?还是代码不好?OP是否需要改用
printf
?你想说什么?OP的系统可能不支持:ncurses需要正确的wcwidth区域设置信息,而printf不使用wcwidth-information。好吧,我想我说的太微妙了,但我想说的是,你应该编辑你的答案,以便更清楚你的建议是什么,因为目前我不相信这是一个真正的答案。我使用了给定的示例,但没有对其进行更改。那么我如何让区域设置知道我需要显示的长度呢?