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

时间:2016-04-06 20:16:51

标签: c ncurses

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

我有这个程序:

#include <ncurses.h>
int main () {
    initscr();
    int d = getch();
    mvprintw(0, 0, "letter: %c.", d);
    refresh();
    getch();
    endwin();
    return 0;
}

我使用:gcc -lncursesw a.c

构建它

如果我在7位ascii中输入一个字符,就像'e'字符一样,我得到:

letter: e.

然后我必须输入另一个程序才能结束。

如果我在扩展的ascii中输入一个字符,比如'á'字符,我得到:

letter:  .

,程序结束。

它就像第二个字节被读作另一个字符。

如何获得正确的字母'á'???

谢谢!

1 个答案:

答案 0 :(得分:1)

要输入的字符需要程序设置区域设置。如manual

中所述
Initialization

   The  library uses the locale which the calling program has
   initialized.  That is normally done with setlocale:

         setlocale(LC_ALL, "");

   If the locale is not initialized, the library assumes that
   characters  are  printable  as in ISO-8859-1, to work with
   certain legacy programs.  You should initialize the locale
   and  not  rely on specific details of the library when the
   locale has not been setup.

过去,您的语言环境可能使用UTF-8。要使用UTF-8,您应该编译并链接 ncursesw 库。

此外,getch函数仅返回单字节编码的值,例如ISO-8859-1,有些人与Windows cp1252混淆,从而导致&#34;扩展ASCII&# 34; (这说明了两个没有取消的谬误)。 UTF-8是一种多字节编码。如果您使用getch来读取 ,您将获得该字符的第一个字节。

相反,要阅读 UTF-8 ,您应该使用get_wch(除非您想自己解码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;
}

我将结果打印为数字,因为printw不知道Unicode值。 printw使用与printf相同的C运行时支持,因此您可以直接打印该值。例如,我发现POSIX printf有一个格式化选项来处理wint_t

  

<强> c
  int参数应转换为unsigned char,并写入结果字节。   
  如果存在 l ell )限定符,则wint_t参数应转换为 ls 转换规范,没有精度,参数指向类型为wchar_t的双元素数组,其第一个元素包含 {{1}的wint_t参数转换规范,第二个元素包含一个空宽字符。

由于ncurses适用于许多平台,因此并非所有平台都支持支持该功能。但您可以假设它适用于GNU C库:大多数发行版通常提供可行的语言环境配置。

这样做,这个例子更有趣:

ls