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

标签 python python-3.x ubuntu-18.04 gnome-terminal python-curses

我不能用 字符为诅咒边界。
代码示例:

import curses

stdscr = curses.initscr()
c = '█'
stdscr.border(c, c, c, c, c, c, c, c)
stdscr.getch()
我得到这个错误:

OverflowError: byte doesn't fit in chtype


但是我可以使用 addstr像这样写一些 utf-8 字符:
stdscr.addstr(0, 0, "█")
谢谢你的帮助。

最佳答案

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

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

它适用于 addstr因为该函数需要一个字符串并接受 3 个字节的序列。但它会打破 addch期望一个字符串。

换句话说,除了需要字符串的地方,curses 模块不会接受多字节 UTF-8 序列。

可能的解决方法:

  • 使用底层 ncurses 库和 curses 的推荐方法Python 模块是查找符合您要求的单字节编码。 Latin1 (ISO-8859-1) 甚至是 ncurses 的默认值,但其他编码可以更好地满足您的需求。
  • 找到(或编写)一个围绕 ncursesw 的 Python 包装器。这是使用宽(16 位)字符的 ncurses 的变体。它会很乐意接受0x2588作为字符值,或者更一般地说,任何只有 16 位代码点的字符,这只是 Unicode 的基本多语言平面。不幸的是,我不知道。
  • 关于python - 使用 utf-8 字符作为诅咒边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60350904/

    相关文章:

    azure - 如何让 Ubuntu 看到我在 azure 门户中增加了磁盘大小

    python - 如何仅使用标准库将 UTC 日期时间转换为本地日期时间?

    python - 从稀疏矩阵的行创建稀疏对角矩阵

    python - 无法导入 Pandas 和 numpy

    python-3.x - 如何在 VS Code 终端中激活 python 虚拟环境?

    ssl - MyDomain.com 仅提供正向 SSL 证书的可复制文本 : one for cert and one for key. 如何在我的 nginx Web 服务器上安装它?

    Python URL 和目标列表

    python - 获取明年 1 月 1 日

    python - 将缺少加号偏移日期时间字符串转换为正确的日期时间

    python - 安装 tflearn 但未找到 contrib