无法从NCURSES中的标准扩展ASCII字符中读取

无法从NCURSES中的标准扩展ASCII字符中读取,c,ncurses,C,Ncurses,我在尝试读取NCURSES中的扩展ASCII字符时遇到问题 我有这个计划: #include <ncurses.h> int main () { initscr(); int d = getch(); mvprintw(0, 0, "letter: %c.", d); refresh(); getch(); endwin(); return 0; } 然后我必须输入另一个,程序才能结束 如果我在扩展ascii中键入一个字符,如

我在尝试读取NCURSES中的扩展ASCII字符时遇到问题

我有这个计划:

#include <ncurses.h>
int main () {
    initscr();
    int d = getch();
    mvprintw(0, 0, "letter: %c.", d);
    refresh();
    getch();
    endwin();
    return 0;
}
然后我必须输入另一个,程序才能结束

如果我在扩展ascii中键入一个字符,如“á”字符,我会得到:

letter: e.
letter:  .
节目结束了

它类似于第二个字节被读取为另一个字符

我怎样才能得到正确的字符


谢谢

要键入的字符需要程序设置区域设置。如以下文件所述:

除此之外,您的区域设置很可能使用UTF-8。要使用UTF-8,您应该编译并链接ncursesw库

此外,
getch
函数只返回单字节编码的值,例如ISO-8859-1,有些人会混淆它,然后返回“扩展ASCII”(这表示两个错误没有消除)。UTF-8是一种多字节编码。如果您使用
getch
读取该字符,您将获得该字符的第一个字节

相反,要读取UTF-8,您应该使用(除非您想自己解码UTF-8)。这是一个经过修订的计划:

#include <ncurses.h>
#include <locale.h>
#include <wchar.h>
int
main(void)
{   
    wint_t value;
    setlocale(LC_ALL, "");
    initscr();
    get_wch(&value);
    mvprintw(0, 0, "letter: %#x.", value);
    refresh();
    getch();
    endwin();
    return 0;
}

没有标准的“扩展ASCII”。只是一堆不同的编码。目前还不清楚您的终端使用哪一种,可能是UTF-8,它是一种可变长度代码。因此,您必须读取多个
char
s才能组成一个字符。您应该验证并检查ncurses是否提供了处理此问题的函数,例如,使用wide
char
s。我不知道ncurses,但Windows
conio.h
function
getch()
在按下某些键(如功能键)时,在连续调用时返回2个值。编写一个简单的程序来显示连续按键的(数字)结果。我正在链接ncursesw。我添加了setlocale(LC_ALL,“”);在initscr()之前,但现在我得到。。“etter:M-!”,没有引号..我让它在另一台计算机上工作,就像你展示的那样!!是否存在类似“mvwprintw”的函数,但用于宽字符???
#include <ncurses.h>
#include <locale.h>
#include <wchar.h>
int
main(void)
{   
    wint_t value;
    setlocale(LC_ALL, "");
    initscr();
    get_wch(&value);
    mvprintw(0, 0, "letter: %#x.", value);
    refresh();
    getch();
    endwin();
    return 0;
}
#include <ncurses.h>
#include <locale.h>
#include <wchar.h>
int
main(void)
{   
    wint_t value;
    setlocale(LC_ALL, "");
    initscr();
    get_wch(&value);
    mvprintw(0, 0, "letter: %#x (%lc).", value, value);
    refresh();
    getch();
    endwin();
    return 0;
}