是诅咒';Python 3中的window.insnstr因宽字符而中断?

是诅咒';Python 3中的window.insnstr因宽字符而中断?,python,python-3.x,cjk,curses,Python,Python 3.x,Cjk,Curses,使用Python 3的ncurses绑定打印宽字符时,使用window.insnstr时会压缩空格。以下是重现问题的代码: import curses def main(window): window.insnstr(0, 0, "insnstr", 80) window.insnstr(1, 0, "赵启明 XXX", 80) window.insnstr(2, 0, "001122 XXX", 80) window.in

使用Python 3的ncurses绑定打印宽字符时,使用window.insnstr时会压缩空格。以下是重现问题的代码:

import curses


def main(window):
    window.insnstr(0, 0, "insnstr", 80)
    window.insnstr(1, 0, "赵启明          XXX", 80)
    window.insnstr(2, 0, "001122          XXX", 80)
    window.insnstr(3, 0, "赵启明          XXX", 80)
    window.insnstr(4, 0, "001122          XXX", 80)
    window.addnstr(6, 0, "addnstr", 80)
    window.addnstr(7, 0, "赵启明          XXX", 80)
    window.addnstr(8, 0, "001122          XXX", 80)
    window.addnstr(9, 0, "赵启明          XXX", 80)
    window.addnstr(10, 0, "001122          XXX", 80)
    window.addnstr(11, 0, "Press any key to exit.", 80)
    window.refresh()
    window.get_wch()


if __name__ == "__main__":
    curses.wrapper(main)
使用tmux、Xterm和st,我得到以下输出:

insnstr
赵启明       XXX
001122          XXX
赵启明       XXX
001122          XXX

addnstr
赵启明          XXX
001122          XXX
赵启明          XXX
001122          XXX
Press any key to exit.
我希望两个街区的路线相同。有趣的是,如果我用任何其他字符替换空格,对齐方式是一致的:

insnstr
赵启明----------XXX
001122----------XXX
赵启明----------XXX
001122----------XXX

addnstr
赵启明----------XXX
001122----------XXX
赵启明----------XXX
001122----------XXX
Press any key to exit.
根据您的浏览器字体,数字可能对齐,也可能不对齐;请参阅此屏幕截图以查看输出在终端仿真器中的外观:


这是NCourses库中的一个bug,还是Python实现的库中的一个bug,还是我误解了这个curses函数应该如何工作?

它看起来像NCourses库中的一个bug:addstr风格的使用频率远远高于插入/删除操作,而且ncurses必须做一些特殊的簿记来跟踪双宽度字符


这是固定的,最终将在您使用的任何软件包中。

感谢您的修复。我发现在文本上设置某些属性可以防止此错误的发生,因此我最终要做的是将
A_-PROTECT
添加到所有
addnstr
调用中,例如:
self.window.addnstr(0,0,line,self.width,curses.A_-PROTECT)
A_-PROTECT
并不是唯一有效的属性,但我选择了
A_-PROTECT
,因为设置该属性不会修改文本的视觉外观。这可能是因为它在内部强制进行了一些额外的更新。我不确定,确切地说。