使用带有curses边框和python3的utf-8编码

费城

我无法在python3 curses程序中使用。这是我的代码的一部分:

    import curses
    import locale

    locale.setlocale(locale.LC_ALL)
    locale.getpreferredencoding()
    stdscr = curses.initscr()
    caracter = str('█')
    stdscr.border(
            caracter, caracter, caracter, caracter, 
            caracter, caracter, caracter, caracter)

我收到此错误

OverflowError:字节不适合chtype

但是我可以使用该addstr函数编写一些utf-8代码,例如

    stdscr.addstr(0, 0, "█")

谢谢你的帮助。

Serge Ballesta

问题在于Pythoncurses包只是ncurses C库的包装。在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序列,除非它期望使用字符串。

可能的解决方法:

  • 使用基础ncurses库和cursesPython模块的推荐方法是找到符合您要求的单字节编码。Latin1(ISO-8859-1)甚至是ncurses的默认设置,但是其他编码可以更好地满足您的需求。
  • 在ncursesw周围查找(或编写)Python包装器。这是使用宽(16位)字符的ncurses的变体。它会很乐意接受0x2588一个字符值,或者更普遍地接受仅具有16位代码点的任何字符,这仅仅是Unicode的基本多语言平面。不幸的是,我不知道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章