【发布时间】:2019-01-25 00:19:40
【问题描述】:
在 nCurses 中读取键盘输入时,我使用 getch() 函数,该函数适用于 ASCII 字符,但适用于 UTF-8 编码字符。如果我在键盘上按下字符 ś:
int c = getch();
c 的值应为十六进制:0xC59B。但是当我尝试打印它的值时,我只得到 0xC5。
如何读取整个字符以及使用 getch() 函数是否正确?
【问题讨论】:
在 nCurses 中读取键盘输入时,我使用 getch() 函数,该函数适用于 ASCII 字符,但适用于 UTF-8 编码字符。如果我在键盘上按下字符 ś:
int c = getch();
c 的值应为十六进制:0xC59B。但是当我尝试打印它的值时,我只得到 0xC5。
如何读取整个字符以及使用 getch() 函数是否正确?
【问题讨论】:
getch 读取字节,但 UTF-8 是多字节的。您可以逐字节读取并解释它,但这是大多数人不需要的工作。使用get_wch 读取(整个)宽字符。
假设您已经使用 initialized ncurses 的语言环境:
setlocale(LC_ALL, "");
(如果你不这样做,getch 无论如何都不会返回正确的字节)。
【讨论】:
getch() 加上顶部的解码,就像我参考的答案一样,你写的!! (这也是为什么 Windows API 的宽字符约定在理论上被破坏的原因,尽管在那种环境中强制使用 UTF-16 的事实有所缓解)
get_wch 完全按照要求进行。
getch 的结果打印到控制台以检查此调用产生的内容,并表示如果调用要提供构成字符的所有代码点,他们所期望的结果。)
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 键!)。
【讨论】: