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

发布于 2021-01-29 15:00:47

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

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

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    可以使用这些字符的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中有效。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看