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

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

我无法在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, "█")

感谢您的帮助。

python python-3.x ubuntu-18.04 gnome-terminal python-curses
1个回答
0
投票

问题是Python curses包只是ncurses C库的包装。在ncurses(https://linux.die.net/man/3/ncurses)中,字符表示为chtype,(字符和属性数据),其中该字符是C char类型,在常见系统上只是一个字节。

基础border函数期望边框的每个字符都是一个字节,而您尝试使用的'FULL BLOCK'是Unicode字符U + 2588或UTF-8字节字符串border。这就是错误消息的原因:您尝试将3个字节的序列存储到一个单字节变量中。

对于b'\xe2\x96\x88'来说效果很好,因为该函数需要一个字符串并接受3个字节的序列。但它会与addstr分开,后者需要一个字符串。

换句话说,curses模块将不接受多字节UTF-8序列,除非它期望使用字符串。

可能的解决方法:

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