2015-04-21 3 views
4

У меня проблемы с выравниванием японских символов в python.Выравнивание японских символов в python

Код:

print "{c1}{name:>14s}{c2}{nick_name:>14s}{planes:>16s}".format(
    name=name, nick_name=nick_name, planes=planes, 
    c1=u.color['yellow'], c2=u.color['default'] 
) 

Результат: enter image description here

Если строка содержит английский и только цифры, то .format() работает отлично, как показано на рисунке справа.

Выравнивание идет не так, когда встречается с японскими символами, как показано слева.

Интересно, что при выравнивании с {name:>14s}:

  • Если "имя" содержит 4 JP символов, будет 2 префикса пространства.
  • Если «имя» содержит 3 символа JP, будет 5 префиксных пространств.
  • Если «имя» содержит 2 символа JP, должно быть 8 префиксных пространств.
  • Если «имя» содержит 0 символов JP, будет 14 префиксных пространств.

Кажется, что в этом случае он обрабатывает 1 японский charater = 3 пробела.

{name:<14s}{name:^14s}{name:>14s} все имеют упомянутое выше поведение.

Я использую OSX 10.10.2, терминальный шрифт - monaco.

Возможно, это имеет какое-то отношение к символам полной ширины/полуширины.

Есть ли все равно, чтобы выровнять японские символы так же, как английские символы?

Спасибо.


Edit:

Игнасио ответ Васкес-Абрамс является действительно правильным путем.

  • Каждый, кто имеет дело с Юникода в Python следует читать the slide он указал.

  • «\ u3000» - это пространство полной ширины в CJK. См. this page.

  • Отзыв .Format Syntax также поможет.

  • Я также хотел бы рекомендовать this SO answer, который поможет мне понять, как работает юникод в Python.

Однако, если строка содержит символы полуширины и полной ширины, выравнивание по-прежнему идет не так. Простым обходным путем является использование всех символов полной ширины.

enter image description here

ответ

3

Вы выполняете два goofups одновременно:

  1. Вы используете последовательность UTF-8 байт вместо последовательности символов.
  2. Вы выравниваете, используя полуширины.

Для первого, use unicodes instead of strs. Для второго используйте вместо этого пробелы шириной.

>>> print '{:>8s}'.format('ありがとう') 
ありがとう 
>>> print u'{:>8s}'.format(u'ありがとう') 
    ありがとう 
>>> print u'{:\u3000>8s}'.format(u'ありがとう') 
   ありがとう 
+0

Спасибо, это действительно правильный ответ. Я редактировал свой пост. Другой вопрос пришел ко мне. Вы знаете, как выровнять строки с символами полуширины и полной ширины? Теоретически, может показаться странным смешивать как половину, так и полный - с символом - это строка. Но на практике это совершенно нормально, поскольку мы почти никогда не используем полноразмерный английский и цифры. :) – user2875289

+0

Вам нужно будет перебирать строку, подсчитывая, сколько из них есть, а затем введите соответствующий тип и количество пробелов. –

+0

Я думал о том же, но задаюсь вопросом, есть ли лучший способ. Еще раз спасибо. – user2875289

Смежные вопросы