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

问题描述 投票:0回答:2

我不能使用

字符作为诅咒边框。

代码示例:

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
2个回答
5
投票

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

0
投票

我使用以下方法来处理 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)`
© www.soinside.com 2019 - 2024. All rights reserved.