在python中对齐日语字符

时间:2015-04-21 15:13:48

标签: python format text-alignment

我难以在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}对齐时:

  • 如果“name”包含4个JP字符,则会有2个前缀空格。
  • 如果“name”包含3个JP字符,则会有5个前缀空格。
  • 如果“name”包含2个JP字符,则会有8个前缀空格。
  • 如果“name”包含0个JP字符,则会有14个前缀空格。

在这种情况下,它似乎可以处理1个日本字符= 3个空格。

{name:<14s} {name:^14s} {name:>14s}都有上述行为。

我使用的是OSX 10.10.2,终端字体是monaco。

这可能与全角/半角字符有关。

有没有像英文字符那样对齐日文字符?

谢谢你。


编辑:

Ignacio Vazquez-Abrams的答案确实是正确的方法。

  • 每个在Python中处理unicode的人都应该阅读他指出的the slide

  • “\ u3000”是CJK中的全角空格。请参阅this page

  • 查看.Format Syntax也会有所帮助。

  • 我还想推荐this SO answer,这有助于我了解unicode在Python中的工作原理。

但是,如果字符串包含半角和全角字符,则对齐仍然会出错。一个简单的解决方法是使用所有全角字符。

enter image description here

1 个答案:

答案 0 :(得分:4)

你同时进行两次游戏:

  1. 您使用的是UTF-8字节序列而不是字符序列。
  2. 您正在使用半角空格进行对齐。
  3. 首先,use unicodes instead of strs。对于第二种,请使用全宽空格。

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