Align unicode text in terminal window using default monospace font
Question: I am pulling data from the web and want to align it in a table in a terminal
window. I can align the text fine in most cases but when the text contains
certain symbols or foreign characters things get messy. How can I handle these
characters? Here is an example with the problem on the third line of output:

    
    
    >>> 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 
    >>> 
    

Note: I quoted all the items correctly. The `"Orange"`closing quotes don't
show correctly here on Stack Overflow but they display fine in the terminal
window.

**UPDATE:** I have added a bounty to this question. I am looking for a
solution that can be implemented without too much additional code and without
using external libraries. It should also work with python 2.7+ and 3.x
(conditionals that test for versions and apply different fixes would be fine).
Also it should not require any additional system configuration or changing of
fonts or changing any terminal settings of a standard Debian/Ubuntu
installation.


Answer: The special behaviour for those particular characters can be identified using
the [East Asian width](http://www.unicode.org/reports/tr11/) property from
their Unicode data. Taking the suggestion from [Programmatically tell if a
Unicode character takes up more than one character space in a
terminal](http://stackoverflow.com/questions/7086856/programmatically-tell-if-
a-unicode-character-takes-up-more-than-one-character-sp) and using that value
for alignment:

    
    
    #!/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))
    

gives:

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

This may appear misaligned if your browser is using a 1.5-width glyph for
those characters; in my terminal, `plan` is exactly the same width as `으르`.

Syntax here is Python 3, but the same technique works in 2.7.

