以ncurses方式从键盘读取UTF-8编码的字符

时间:2019-01-25 00:19:40

标签: c++ utf-8 ncurses

在nCurses中读取键盘输入时,我使用getch()函数,该函数对ASCII字符有效,但对UTF-8编码的字符无效。如果我在键盘上按字母Ë:

int c = getch();

c的值应为十六进制:0xC59B。但是,当我尝试打印其值时,只会得到0xC5。

我如何阅读整个字符,并且getch()是正确使用的函数吗?

2 个答案:

答案 0 :(得分:2)

getch读取字节,但是UTF-8是多字节。您可以逐字节读取并解释它,但这是大多数不需要的工作。使用get_wch读取(整个)宽字符

假设您拥有initialized ncurses的语言环境:

setlocale(LC_ALL, "");

(如果您不这样做,则getch不会返回正确的字节)。

答案 1 :(得分:1)

getch的名称来自旧地球,意为“字符”,实际上只是“字节”。这种机制无法理解多字节编码。

但是,it is still the right function to use;您只需要正确处理其结果即可。重复调用它,然后将得到的结果转储到一个字节字符串中(在您的特定示例中,您将需要两次调用以获取足够的字节来表示所提供的特定Unicode字符),然后是interpret those bytes with a UTF-8 library

别忘了将getch可以提供的“特殊值”过滤为it does not always give you raw characters(例如,考虑 F1 键!)。