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

时间:2014-02-12 01:14:23

标签: python text unicode command-line terminal

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

>>> 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安装的任何终端设置。

1 个答案:

答案 0 :(得分:4)

可以使用Unicode数据中的East Asian width属性来标识这些特定字符的特殊行为。从Programmatically tell if a Unicode character takes up more than one character space in a terminal获取建议并使用该值进行对齐:

#!/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中起作用。