小编典典

使用默认等宽字体在终端窗口中对齐Unicode文本

python

我正在从网上提取数据,并希望将其与终端窗口中的表格对齐。在大多数情况下,我可以使文本对齐很好,但是当文本包含某些符号或外来字符时,情况会变得混乱。如何处理这些字符?这是关于输出第三行问题的示例:

>>> items = "Apple tree", "Banana plant", "Orange 으르", "Goodbye"
>>> values = 100, 200, 300, 400
>>> for i, v in zip(items, values):
...     print "%-15s : %-4s" % (i, v)
... 
Apple tree      : 100 
Banana plant    : 200 
Orange 으르   : 300 
Goodbye         : 400 
>>>

注意:我正确引用了所有项目。"Orange"此处的结束引号在Stack Overflow上显示不正确,但在终端窗口中显示正常。

更新: 我为这个问题添加了赏金。我正在寻找一种无需太多额外代码也无需使用外部库即可实现的解决方案。它也应该与python
2.7+和3.x一起工作(测试版本并应用不同修复程序的条件是可以的)。而且,它不需要任何其他系统配置,也不需要更改字体或更改标准Debian /
Ubuntu安装的任何终端设置。


阅读 185

收藏
2021-01-20

共1个答案

小编典典

可以使用这些字符的Unicode数据中的东亚宽度属性来标识这些特殊字符的特殊行为。从编程中获取建议,以判断Unicode字符是否在终端中占用多个字符空间,并使用该值进行对齐:

#!/usr/bin/python3

import unicodedata

items = "Apple tree", "Banana plant", "Orange 으르", "Goodbye"
values = 100, 200, 300, 400
for i, v in zip(items, values):
    eawid = len(i) + sum(1 for v in i if unicodedata.east_asian_width(v) == 'W')
    pad = ' ' * (15 - eawid)
    print("%s%s : %-4s" % (i, pad, v))

给出:

Apple tree      : 100 
Banana plant    : 200 
Orange 으르     : 300 
Goodbye         : 400

如果您的浏览器对这些字符使用1.5宽度的字形,则这些字符可能看起来未对齐;在我的终端中,plan宽度与完全相同으르

语法是Python 3,但相同的技术在2.7中有效。

2021-01-20