对齐 python 中的 unicode 字符时出现问题

Problems aligning unicode characters in python

我正在尝试让垂直条在以下程序的输出中对齐

print('  |\n   |')

特殊的'N'是U+1D4A9.

在我的终端中使用 ipython(我正在使用 Ubuntu)对齐很好:

但是如果我 运行 在 spyder 中使用完全相同的代码,输出将不会对齐:

请注意,我在两个示例中使用了完全相同的字体和字体大小 (Ubuntu Mono 12)。我还尝试通过插入所有类型的不同大小的 unicode 空格来使其对齐,但没有成功。我也测试了 jupyter,它也没有对齐。

我的主要问题是如何使它在终端和 spyder/jupyter 中对齐。知道为什么它现在不对齐也很有趣,因为我使用的是完全相同的字体。字体渲染器的差异?

这也是终端的文本输出(在我的浏览器中看起来有点错位):

In [1]: print('  |\n   |')                                                                                                                                               
  |
   |

这是当前基于单元格终端的 Qt 输出中的一个问题,因为不同宽度的字符没有与终端使用的单元格网格正确对齐。 一种解决方法是尝试使用其他定位字符来强制对齐,而不是简单地打印非标准字符。两个这样的字符是 \t\b - \t - "tab" 字符会将打印转发到下一个 "tab stop" - 默认情况下,8 [= 的倍数41=]。 也就是说,使用:print('\t|\n\t|') - 这是我在 Konsole(另一个基于 Qt 的终端)中得到的:

\b 字符的意思是 "backspace" - 所以我打印了其中的 4 个来走 "back" 4 个单宽单元格以接近您想要的排列)

使用终端库

另一个选项,如果你想要一个具有复杂布局的交互式应用程序(比如显示颜色,接受用户输入而不必等待 "enter" 被按下),如果使用 terminedia 图书馆(免责声明:我是这个项目的作者)。

它允许您将终端明确地作为一个网格来处理,并且当非标准宽度的字符被打印时"know"并且'round'它们的宽度为两个单元格。

因此,为了使用 terminedia 显示相同的内容,我实例化了一个 "Screen" 对象,它允许我在确切位置使用 print_at - 我使用的完整代码是:

import terminedia as TM
sc = TM.Screen()
sc.print_at((0, 10),'  |', color="red")
sc.print_at((0,11), '    | ', color="red")
sc.update()

要安装 terminedia,请使用 pip install git+https://github.com/jsbueno/terminedia.git(抱歉,我没有发布新版本是我的错)