【问题标题】:Problems aligning unicode characters in python在python中对齐unicode字符的问题
【发布时间】:2020-07-22 01:56:22
【问题描述】:

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

print('????  |\n   |')

特殊的“N”是 U+1D4A9。

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

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

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

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

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

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

【问题讨论】:

  • 这看起来像一个错误。请举报here

标签: python unicode fonts ipython spyder


【解决方案1】:

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

\b 字符的意思是“退格” - 所以我打印了其中的 4 个来“向后”走 4 个单宽度单元格,以接近您的想法)

使用终端库

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

它允许您将终端明确地作为网格处理,并且将“知道”何时打印非标准宽度的字符并将它们的宽度“四舍五入”为两个单元格。

因此,为了使用 terminedia 显示相同的内容,我实例化了一个“屏幕”对象,它允许我在确切位置使用 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(对不起,我没有发布新版本是我的错)

【讨论】:

  • 感谢您的回答!但是,我无法让您使用 tab 的解决方法在 spyder 中工作。还是一样的错位。
  • 我会接受这个答案,因为它指出了潜在的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多