使用 utf-8 字符作为 curses 边框

Use utf-8 character for curses border

我不能使用 字符作为 curses 的边框。

代码示例:

import curses

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

我得到这个错误:

OverflowError: byte doesn't fit in chtype

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

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

感谢您的帮助。

问题是 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 的基本多语言平面。不幸的是,我知道none。