使用 utf-8 字符作为诅咒边框

Fil*_*ila 4 python gnome-terminal python-3.x python-curses ubuntu-18.04

我不能使用\xe2\x96\x88字符来诅咒边界。

\n

代码示例:

\n
import curses\n\nstdscr = curses.initscr()\nc = \'\xe2\x96\x88\'\nstdscr.border(c, c, c, c, c, c, c, c)\nstdscr.getch()\n
Run Code Online (Sandbox Code Playgroud)\n

我收到此错误:

\n
\n

溢出错误:字节不适合 chtype

\n
\n

不过我可以用来addstr写一些 utf-8 字符,如下所示:

\n
stdscr.addstr(0, 0, "\xe2\x96\x88")\n
Run Code Online (Sandbox Code Playgroud)\n

感谢您的帮助。

\n

Ser*_*sta 5

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