尝试在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: .
,程序结束。
它就像第二个字节被读作另一个字符。
如何获得正确的字母'á'???
谢谢!
答案 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