python中对齐unicode字符的问题

2024-09-28 21:51:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

print('𝒩  |\n   |')

特殊的“N”是U+1D4A9

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

enter image description here

但如果在spyder中运行完全相同的代码,则输出将不对齐:

enter image description here

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

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

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

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

Tags: 代码程序终端示例类型ubuntuipythonunicode
1条回答
网友
1楼 · 发布于 2024-09-28 21:51:57

基于单元的终端的当前Qt输出中存在一个问题,即不同的宽度字符未与终端使用的单元网格正确对齐。 一种解决方法是尝试通过使用其他定位字符而不是简单地打印非标准字符来强制对齐。两个这样的字符是\t\b-\t-“制表符”字符将打印转发到下一个“制表符停止”-默认情况下,是8个“单宽字符单元格”的倍数。 也就是说,使用:print('𝒩\t|\n\t|')-以下是我在Konsole(另一个基于Qt的终端)中得到的结果:

Ipython session on konsole depicting  the use of <code>\t</code> for alignment

(字符\b的意思是“backspace”-因此我打印了其中的4个字符,以便“back”4个单宽单元格,以接近您心目中的排列方式)

使用终端库

如果你想要一个布局复杂的交互式应用程序(比如显示颜色,无需等待按下“回车”键即可接受用户输入),如果你想使用terminedia库(免责声明:我是这个项目的作者),另一个选项非常合适

它允许您以网格的形式明确地处理终端,并且将“知道”何时打印非标准宽度字符,并将其宽度“圆整”为两个单元格

因此,为了使用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(对不起,我没有发布新版本是我的错)

Output created using terminedia

相关问题 更多 >