问题描述
我试图解决的问题是获得一对 ch
,att
代表当前显示在某个给定位置的字符和相关属性。
现在,当显示的字符不是宽字符(即 ASCII 字符)时,方法 .inch
会完成工作以正确屏蔽结果。当显示的字符很宽时就会出现问题。更准确地说,我知道如何通过 .instr
获取给定的字符,但是此函数不返回有关该属性的任何信息。
由于,据我所知,没有单独获取属性的特定函数,我的第一次尝试是使用 .inch
,去掉 8 个较低的有效位并将结果解释为属性。这似乎在某种程度上有效,但仔细检查我意识到以这种方式阅读没有属性的希腊字母(例如u"u\03b1"
)会返回att = 11.0000.0000
而不是0
。有没有更好的方法来解决这个问题?
编辑,python3 的最小示例
import curses
def bin(x):
out = ''
while x > 0:
out = str(x % 2) + out
x = x // 2
return out
def main(s):
s.addstr(1,1,u'\u03b1')
s.refresh()
chratt = s.inch(1,1)
att = chratt & 0xFF00
s.addstr(2,bin(att))
s.refresh()
while True:
pass
curses.wrapper(main)
解决方法
在curses 中,inch 和instr 仅适用于您怀疑的ascii 字符。正如一位 ncurses 创建者所解释的那样,像 utf-8 中的字符这样的“复杂”或“宽”字符有另一个系统。
然而,坏消息。它们还没有在 python 诅咒中实现。已提交拉取请求 here on stackoverflow 并且它非常接近合并 (90%),所以如果您真的需要它,那么为什么不自己去贡献呢?
如果这不是一个选项,那么您可以尝试将您对屏幕所做的每个更改存储在一个变量中,然后从那里提取宽字符。