我不能使用█
字符的诅咒边界。
代码示例:
import curses
stdscr = curses.initscr()
c = '█'
stdscr.border(c, c, c, c, c, c, c, c)
stdscr.getch()
字符串
我得到这个错误:
OverflowError:字节不适合chtype
但是,我可以使用addstr
来写一些utf-8字符,如下所示:
stdscr.addstr(0, 0, "█")
型
谢谢你的帮忙。
我不能使用█
字符的诅咒边界。
代码示例:
import curses
stdscr = curses.initscr()
c = '█'
stdscr.border(c, c, c, c, c, c, c, c)
stdscr.getch()
字符串
我得到这个错误:
OverflowError:字节不适合chtype
但是,我可以使用addstr
来写一些utf-8字符,如下所示:
stdscr.addstr(0, 0, "█")
型
谢谢你的帮忙。
2条答案
按热度按时间flvlnr441#
问题是Python
curses
包只是ncurses C库的 Package 器。在ncurses(https://linux.die.net/man/3/ncurses)中,字符表示为 chtype,(字符和属性数据),其中字符是Cchar
类型,在常见系统中只是一个字节。底层的
border
函数期望边界的每个字符都是一个字节,而你试图使用的'FULL BLOCK'是Unicode字符U+2588或UTF-8字节字符串b'\xe2\x96\x88'
。这就是错误消息的原因:你试图将一个3字节的序列存储到一个单字节变量中。它在
addstr
上运行良好,因为该函数需要一个字符串并接受3个字节的序列。但在addch
上运行时,它需要一个字符串。换句话说,curses模块不接受多字节UTF-8序列,除非它需要字符串。
可能的解决方法:
curses
Python模块的推荐方法是找到符合您要求的单字节编码。Latin 1(ISO-8859-1)甚至是ncurses的默认编码,但其他编码可以更好地满足您的需求。0x2588
作为字符值,或者更一般地接受任何具有16位代码点的字符,这只是Unicode的基本多语言平面。不幸的是,我不知道。7uzetpgm2#
我使用以下方法处理ASCII字符或utf-8特殊符号:
screen.addch(),screen.inch():curses字符有1个字节和属性,只能用于表示ASCII字符及其属性
screen.addstr(),screen.instr():utf-8字符= 3字节的字符串。读取为3字节字符串或打印为3字节字符串,然后进行utf-8解码
示例如下:
字符串