Отображение ширины строк Юникода в Python [дубликаты]

На этот вопрос уже есть ответ:

Нормализация Юникода 2 ответа

Как я могу определить ширину отображения строки Unicode в Python 3.x, и есть ли способ использовать эту информацию для выравнивания этих строк сstr.format()?

Пример мотивации: Печать таблицы строк на консоли. Некоторые строки содержат символы не ASCII.

>>> for title in d.keys():
>>>     print("{:<20} | {}".format(title, d[title]))

    zootehni-           | zooteh.
    zootekni-           | zootek.
    zoothèque          | zooth.
    zooveterinar-       | zoovet.
    zoovetinstitut-     | zoovetinst.
    母                   | 母母

>>> s = 'è'
>>> len(s)
    2
>>> [ord(c) for c in s]
    [101, 768]
>>> unicodedata.name(s[1])
    'COMBINING GRAVE ACCENT'
>>> s2 = '母'
>>> len(s2)
    1

Как можно заметить,str.format() просто принимает количество кодовых точек в строке len(s)) в качестве ширины, что приводит к перекосу столбцов в выводе. Поиск черезunicodedata модуль, я не нашел ничего предлагающего решение.

Нормализация юникода может исправить проблему для è, но не для азиатских символов, которые часто имеют большую ширину экрана. Аналогично, существуют символы юникода нулевой ширины (например, пробел нулевой ширины для разрыва строки в словах). Вы не можете обойти эти проблемы с помощью нормализации, поэтому, пожалуйста, не предлагайте "нормализовать ваши строки".

Редактировать Добавлена информация о нормализации.

Ред. 2: В моем исходном наборе данных также есть некоторые европейские символы объединения, которые не приводят к единой кодовой точке даже после нормализации:

    zwemwater     | zwemw.
    zwia̢z-       | zw.

>>> s3 = 'a\u0322'   # The 'a + combining retroflex hook below' from zwiaz
>>> len(unicodedata.normalize('NFC', s3))
    2

Ответы на вопрос(1)

Ваш ответ на вопрос