【问题标题】:Read UTF-8 encoded character from keyboard in ncurses从 ncurses 中的键盘读取 UTF-8 编码字符
【发布时间】:2019-01-25 00:19:40
【问题描述】:

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

int c = getch();

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

如何读取整个字符以及使用 getch() 函数是否正确?

【问题讨论】:

    标签: c++ utf-8 ncurses


    【解决方案1】:

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

    假设您已经使用 initialized ncurses 的语言环境:

    setlocale(LC_ALL, "");
    

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

    【讨论】:

    • 仅仅读取宽字符不会给你 UTF-8,这并不意味着你每次调用都会得到一个完整的 Unicode 字符。这就是为什么我推荐getch() 加上顶部的解码,就像我参考的答案一样,你写的!! (这也是为什么 Windows API 的宽字符约定在理论上被破坏的原因,尽管在那种环境中强制使用 UTF-16 的事实有所缓解)
    • OP 要求读取 UTF-8 编码的整个字符get_wch 完全按照要求进行。
    • This answer 错了吗?
    • 这要求不同的点:result 必须是 UTF-8。在这个问题中,result 必须是一个完整的(宽)字符。有区别。
    • OP 想要“读取 UTF-8 字符”。这就是所有的陈述。根本没有提到宽字符。 (他们已将getch 的结果打印到控制台以检查此调用产生的内容,并表示如果调用要提供构成字符的所有代码点,他们所期望的结果。)
    【解决方案2】:

    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 键!)。

    【讨论】:

    • 你说得对,我应该读取所​​有字节。当我第二次调用它时,我得到了 0x9B。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2013-01-31
    • 1970-01-01
    • 2015-07-26
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多