从键盘读取 UTF-8 编码的字符

Read UTF-8 encoded character from keyboard in ncurses

本文关键字:字符 编码 UTF-8 键盘 读取      更新时间:2023-10-16

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

int c = getch();

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

我如何读取整个字符并且 getch() 是正确的函数?

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

这假设您已经初始化了 ncurses 的语言环境:

setlocale(LC_ALL, "");

(如果你不这样做,getch无论如何都不会返回正确的字节)。

>getch的名字来自旧地球的"字符"含义,实际上只是"字节"。此机制无法理解多字节编码。

但是,它仍然是正确的功能;您只需要正确处理其结果。重复调用它并将您获得的内容转储到一串字节中(在您的特定示例中,您需要两次调用才能获得足够的字节来表示提供的特定 Unicode 字符),然后使用 UTF-8 库解释这些字节。

不要忘记过滤掉getch可以提供的"特殊值",因为它并不总是为您提供原始字符(例如考虑 F1 键!