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



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

>>> 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"结束引号在堆栈溢出上无法正确显示,但它们在终端窗口中显示正常。

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

这些特定字符的特殊行为可以使用其 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 中有效。

最新更新