Align unicode text in terminal window using default monospace font
command-line, python, terminal, text, unicode
Solution
The special behaviour for those particular characters can be identified using the East Asian width 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 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.
Problem
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.