【问题标题】:Print long unicode in ncurses在 ncurses 中打印长 unicode
【发布时间】:2016-08-07 07:27:42
【问题描述】:

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

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

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

【问题讨论】:

  • 试试setlocale(LC_ALL, "en_US.UTF-8");
  • 还有printw(L"\U0001F0A1");
  • @sunqingyao 我试过你的代码,但没有显示任何内容
  • @Morovaille 帖子中的答案根本没有帮助

标签: c unicode ncurses


【解决方案1】:

可能的问题是:ncurses 使用wcwidth 来确定字符的宽度,而printf 不检查。您计算机上的语言环境信息太旧,无法提供正确的结果。

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

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

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

【讨论】:

  • 我不太明白你在说什么。你是说OP的系统可能支持也可能不支持吗?还是代码没问题?还是说代码不好? OP 需要改用 printf 吗?你想说什么?
  • OP 的系统可能不支持它:ncurses 需要正确的 wcwidth 语言环境信息,而 printf 不使用 wcwidth 信息。
  • 好吧,我想我太微妙了,但我想说的是,你应该编辑你的答案,以便更清楚你的建议是什么,因为目前我不相信它真的一个答案。
  • 我使用了给定的例子,没有改变它。
  • 那么我怎样才能让语言环境知道我需要显示的长度?
猜你喜欢
  • 2016-06-06
  • 2016-04-04
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多