在C中可以同时使用printf()和ncurses函数吗?

在C中可以同时使用printf()和ncurses函数吗?,c,printf,ncurses,C,Printf,Ncurses,我试图打印ncurses中ASCII扩展表中的字符,但printw()只支持8位长的可打印字符。printf()允许您打印8位以上的字符。我想使用ncurses函数,例如move()来移动光标的位置,同时也使用printf()打印出8位以上的字符 有几种方法可以解决这个问题 1) 以某种方式允许在ncurses模式下输出8位以上的字符。这包括printw()、addch()、wprintw()等。我以前就这个主题提出过问题,但结果有限。我的Ubuntu编译器中的addch()将打印8位以上的部分

我试图打印ncurses中ASCII扩展表中的字符,但printw()只支持8位长的可打印字符。printf()允许您打印8位以上的字符。我想使用ncurses函数,例如move()来移动光标的位置,同时也使用printf()打印出8位以上的字符

有几种方法可以解决这个问题

1) 以某种方式允许在ncurses模式下输出8位以上的字符。这包括printw()、addch()、wprintw()等。我以前就这个主题提出过问题,但结果有限。我的Ubuntu编译器中的addch()将打印8位以上的部分ASCII值,但不是全部。例如

addch(ACS_S1); addch(ACS_LANTERN);
不会打印出角色,而是打印出来

2) 让printf()与诸如move()和init_color()之类的ncurses函数同时工作,这样我就可以打印8位以上的字符。我在这方面遇到问题的原因是,当您在ncurses中使用refresh()时,它会清除底部屏幕,并将其替换为您正在使用的窗口。printf()要么被根除,要么无法与move()一起使用。我认为可能有一个move函数可以在特定窗口上移动光标,在这种情况下,我可能可以移动print,但我不知道printf所在的函数和屏幕

如果这是问题的一部分,我正在使用Ubuntu。我不认为是,但我只是把它包起来。
任何帮助都将不胜感激

[尽管对ncurses中的字符集和Unicode支持有任何混淆,但它们是存在的,并且是完全可用的]:

您可以使用较低级别的
tputs(..,putchar)
代替curses函数,因为它使用stdio
putchar
来编写转义,因此可以与其他stdio函数自由混合,如
printf
fwrite

例如,使用
cc-ltinfo

#包括
#包括
#包括
内部主(空){
炭*杯;
如果(设置项(0,1,0))
errx(1,“设置期限失败”);
如果(!(cup=TIGETSR(“cup”))
errx(1,“终端中无光标寻址”);
TPUT(TIGETSR(“smcup”),1,putchar;
TPUT(蒂帕尔姆杯,13,13),1,普查尔);
printf(“你好”);/*或任何您喜欢的内容*/
getchar();
TPUT(TIGETSR(“rmcup”)、1、putchar;
}
问题是:

我试图打印ncurses中ASCII扩展表中的字符,但printw()只支持8位长的可打印字符

事实上,ncurses的库(通常可用于)处理多字节字符(例如UTF-8),因此
printw
处理如下字符串:

char *foo = "  { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */";
printw ("%s", foo);
它不会像您预期的那样解释这样的事情:

wchar_t foo = 0x04a6;
printw ("%c", foo);
因为底层C运行时将坚持
%C
指的是
字符,而不是
。这一切都依赖于初始化区域设置和使用正确的库


当然可以混合使用stdio和curses,但这并不能解决您所问的问题(要成功地做到这一点需要一些工作)。我在(目录编辑器)中这样做了大约30年,使用屏幕的一部分带有诅咒,另一部分没有。

如果你不介意所造成的混乱,你可以在使用诅咒的同时使用
printf()
。Curses认为它可以控制屏幕,并对屏幕上出现的内容负责。使用
printf()。万劫不复。别这样!您需要了解如何处理带有诅咒的多字节字符集。我没有使用标准的诅咒,所以我不确定规则是什么。你需要找到这些手册并仔细阅读——可能相当仔细。谷歌搜索“ncurses unicode”看起来信息丰富ncurses manual pdf'提供了一些信息,但关于Unicode AFAIC的信息并不多。您确实需要明确您正在使用的代码集。你必须知道你的终端期望什么;你必须知道你的课程支持什么。@JonathanLeffler谢谢你的评论。你能更详细地介绍一下“代码集”吗?至于“你必须知道ncurses支持什么”,我很清楚这一点。如果可以的话,我很想知道每一个无关紧要的细节,但我不知道该去哪里。我目前的知识来源于一个网站,一些YT视频,来这里询问更多experienced@JonathanLeffler这是由Unix中的locales机制处理的,ncurses支持UTF-8(可能还有其他多字节编码,但在2020年几乎没有理由关心它们)。