python curses:在打印前检测文本的显示宽度

python curses: detect text's display width before printing it

我正在使用 Python 和 curses 制作一个小文本编辑器。

但是,我在尝试计算给定文本的宽度时遇到了一些问题。

特别是,我注意到我的终端(MacOS 上的默认终端应用程序)上的中文字符(例如大)和表情符号(例如)实际上占用了典型 ASCII 可打印字符宽度的两倍。

给定一个我打算使用 curses 显示的字符串,有没有什么方法可以确定一个字符串将在屏幕上用完多少列而不实际显示它?

您可能需要 wcwidth()wcswidth()。它们不在标准库中(也不是 curses 的一部分),但可以通过 pip install wcwidth.

获得

您可以创建一个您不会 refresh 的 window(即,将其视为 隐藏 window),并获得打印到隐藏 window.

后的 y,x 坐标

应用程序不需要知道 curses 库如何解释数据(例如它是否使用 wcwidth),而只需要能够观察 curses 将如何处理这些信息。

lynx 浏览器使用该方法来决定是否需要特殊处理来换行文本(请参阅 source code)。尽管这是用 C 语言编写的,但同样的想法可以用于 curses 的 Python 绑定。