python-3.x 使用utf-8字符作为curses边框

tct7dpnv  于 4个月前  发布在  Python
关注(0)|答案(2)|浏览(64)

我不能使用字符的诅咒边界。
代码示例:

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, "█")


谢谢你的帮忙。

flvlnr44

flvlnr441#

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

7uzetpgm2#

我使用以下方法处理ASCII字符或utf-8特殊符号:
screen.addch(),screen.inch():curses字符有1个字节和属性,只能用于表示ASCII字符及其属性
screen.addstr(),screen.instr():utf-8字符= 3字节的字符串。读取为3字节字符串或打印为3字节字符串,然后进行utf-8解码
示例如下:

`wchar = screen.instr(1, 1, 3)  # read 3 bytes at position y=1 and x=1`
`if wchar.decode("utf-8") == '⮞': comment = ' -> success'`
`screen.addstr(3, 1, "utf-8 symbol: " + wchar.decode("utf-8") + comment)`

字符串

相关问题