在ncurses中打印长unicode

时间:2016-04-15 10:51:04

标签: c unicode ncurses

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

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

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

1 个答案:

答案 0 :(得分:3)

可能的问题是:ncurses使用wcwidth来确定角色的宽度,printf不检查。您计算机上的区域设置信息太旧,无法提供正确的结果。

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

enter image description here

根据fileformat-info,这来自Unicode 6.0(2010)。取决于您使用的系统,例如Debian或Ubuntu,可能是&#34;最近&#34;。

ncurses需要正确的wcwidth语言环境信息,而printf不使用wcwidth-information。如果您的语言环境信息太旧,wcwidth会返回一个负值,告诉ncurses该字符是非打印的。在这种情况下,ncurses将显示一个空白。