【问题标题】:Use utf-8 character for curses border使用 utf-8 字符作为诅咒边框
【发布时间】:2020-02-22 09:48:36
【问题描述】:

我不能使用 字符作为诅咒边框。

代码示例:

import curses

stdscr = curses.initscr()
c = '█'
stdscr.border(c, c, c, c, c, c, c, c)
stdscr.getch()

我收到此错误:

溢出错误:字节不适合 chtype

但是我可以使用addstr 来写一些像这样的 utf-8 字符:

stdscr.addstr(0, 0, "█")

感谢您的帮助。

【问题讨论】:

    标签: python python-3.x ubuntu-18.04 gnome-terminal python-curses


    【解决方案1】:

    问题在于 Python curses 包只是 ncurses C 库的包装器。而在 ncurses (https://linux.die.net/man/3/ncurses) 中,字符表示为 chtype,(字符和属性数据),其中字符是 C char 类型,在通用系统上只是一个字节。

    底层 border 函数期望边框的每个字符都是一个字节,而您尝试使用的“FULL BLOCK”是 unicode 字符 U+2588 或 UTF-8 字节字符串 b'\xe2\x96\x88' .这就是错误消息的原因:您尝试将 3 字节序列存储到单字节变量中。

    它适用于addstr,因为该函数需要一个字符串并接受 3 字节序列。但它会与 addch 中断,后者需要一个字符串。

    换句话说,curses 模块不会接受多字节 UTF-8 序列,除非它需要字符串。

    可能的解决方法:

    • 使用底层 ncurses 库和curses Python 模块的推荐方法是找到符合您要求的单字节编码。 Latin1 (ISO-8859-1) 甚至是 ncurses 的默认值,但其他编码可以更好地满足您的需求。
    • 在 ncursesw 周围找到(或编写)一个 Python 包装器。这是使用宽(16 位)字符的 ncurses 变体。它会很高兴地接受0x2588 作为字符值,或者更一般地说,任何只有 16 位代码点的字符,这只是 Unicode 的基本多语言平面。很遗憾,我一个都不知道。

    【讨论】:

    • > 找到符合您要求的单字节编码。您能否解释一下如何找到和使用这种编码格式?我在我的程序中添加了这一行:stdscr.encoding = "utf_8",它仍然给我同样的错误。
    • @AnchithAcharya:这个答案说 utf_8 不合适。如果您使用西欧语言,Latin1(或 ISO-8859-1)就可以了。但是你应该阅读ISO-8859 上的维基百科页面,因为它涵盖了大量的语言......
    • 哦,我的错。我提到的页面是this,它描述了utf_8支持所有语言。我一定是误会了。无论如何,如果有帮助,我只是想打印块字符和框边界字符。
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多