Python utf-8, практическое руководство выравнивает распечатку

У меня есть массив, содержащий японские символы, а также "нормальный". Как я выравниваю распечатку их?

#!/usr/bin/python
# coding=utf-8

a1=['する', 'します', 'trazan', 'した', 'しました']
a2=['dipsy', 'laa-laa', 'banarne', 'po', 'tinky winky']

for i,j in zip(a1,a2):
    print i.ljust(12),':',j

print '-'*8

for i,j in zip(a1,a2):
    print i,len(i)
    print j,len(j)

Вывод:

する       : dipsy
します    : laa-laa
trazan       : banarne
した       : po
しました : tinky winky
--------
する 6
dipsy 5
します 9
laa-laa 7
trazan 6
banarne 7
した 6
po 2
しました 12
tinky winky 11

спасибо,//Fredrik

7
задан Alan Moore 5 April 2010 в 11:19
поделиться

2 ответа

Используя функцию unicodedata.east_asian_width, отследите, какие символы являются узкими и широкими при вычислении длины строки.

#!/usr/bin/python
# coding=utf-8

import sys
import codecs
import unicodedata

out = codecs.getwriter('utf-8')(sys.stdout)

def width(string):
    return sum(1+(unicodedata.east_asian_width(c) in "WF")
        for c in string)

a1=[u'する', u'します', u'trazan', u'した', u'しました']
a2=[u'dipsy', u'laa-laa', u'banarne', u'po', u'tinky winky']

for i,j in zip(a1,a2):
    out.write('%s %s: %s\n' % (i, ' '*(12-width(i)), j))

Выводы:

する          : dipsy
します        : laa-laa
trazan        : banarne
した          : po
しました      : tinky winky

Это не выглядит правильно в некоторых шрифтах веб-браузера, но в окне терминала они выстраиваются правильно.

4
ответ дан 7 December 2019 в 07:43
поделиться

Используйте объекты юникода вместо байтовых строк:

#!/usr/bin/python
# coding=utf-8

a1=[u'する', u'します', u'trazan', u'した', u'しました']
a2=[u'dipsy', u'laa-laa', u'banarne', u'po', u'tinky winky']

for i,j in zip(a1,a2):
    print i.ljust(12),':',j

print '-'*8

for i,j in zip(a1,a2):
    print i,len(i)
    print j,len(j)

Объекты юникода работают с символами напрямую.

2
ответ дан 7 December 2019 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: