对齐 python 中的日语字符
Aligning Japanese characters in 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']
)
结果:
如果字符串仅包含英文和数字,.format() 可以正常工作,如右图所示。
如左图,遇到日文字符时对齐出错
有趣的是,当与 {name:>14s}
对齐时:
- 如果"name"包含4个JP字符,则有2个前缀spaces。
- 如果"name"包含3个JP字符,则有5个前缀spaces。
- 如果"name"包含2个JP字符,则有8个前缀spaces。
- 如果"name"包含0个JP字符,则有14个前缀spaces。
在这种情况下,它似乎处理 1 个日语字符 = 3 spaces。
{name:<14s}
{name:^14s}
{name:>14s}
都有上述行为。
我正在使用 OSX 10.10.2,终端字体是 monaco。
可能这与 full-width/half-width 个字符有关。
有没有像英文字符一样对齐日文字符的方法?
谢谢。
编辑:
Ignacio Vazquez-Abrams 的回答确实是正确的方法。
在 Python 中处理 unicode 的每个人都应该阅读他指出的 the slide。
"\u3000"是中日韩全角space。见 this page.
复习 .Format Syntax 也有帮助。
我还想推荐 this SO answer 这有助于我理解 unicode 在 Python 中的工作原理。
但是,如果字符串同时包含半角字符和全角字符,对齐仍然会出错。一个简单的解决方法是使用所有全角字符。
您同时犯了两个错误:
- 您使用的是 UTF-8 字节序列而不是字符序列。
- 您正在使用半角空格对齐。
对于第一个,use unicode
s instead of str
s。对于第二个,请改用全角空格。
>>> print '{:>8s}'.format('ありがとう')
ありがとう
>>> print u'{:>8s}'.format(u'ありがとう')
ありがとう
>>> print u'{:\u3000>8s}'.format(u'ありがとう')
ありがとう
我在 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']
)
结果:
如果字符串仅包含英文和数字,.format() 可以正常工作,如右图所示。
如左图,遇到日文字符时对齐出错
有趣的是,当与 {name:>14s}
对齐时:
- 如果"name"包含4个JP字符,则有2个前缀spaces。
- 如果"name"包含3个JP字符,则有5个前缀spaces。
- 如果"name"包含2个JP字符,则有8个前缀spaces。
- 如果"name"包含0个JP字符,则有14个前缀spaces。
在这种情况下,它似乎处理 1 个日语字符 = 3 spaces。
{name:<14s}
{name:^14s}
{name:>14s}
都有上述行为。
我正在使用 OSX 10.10.2,终端字体是 monaco。
可能这与 full-width/half-width 个字符有关。
有没有像英文字符一样对齐日文字符的方法?
谢谢。
编辑:
Ignacio Vazquez-Abrams 的回答确实是正确的方法。
在 Python 中处理 unicode 的每个人都应该阅读他指出的 the slide。
"\u3000"是中日韩全角space。见 this page.
复习 .Format Syntax 也有帮助。
我还想推荐 this SO answer 这有助于我理解 unicode 在 Python 中的工作原理。
但是,如果字符串同时包含半角字符和全角字符,对齐仍然会出错。一个简单的解决方法是使用所有全角字符。
您同时犯了两个错误:
- 您使用的是 UTF-8 字节序列而不是字符序列。
- 您正在使用半角空格对齐。
对于第一个,use unicode
s instead of str
s。对于第二个,请改用全角空格。
>>> print '{:>8s}'.format('ありがとう')
ありがとう
>>> print u'{:>8s}'.format(u'ありがとう')
ありがとう
>>> print u'{:\u3000>8s}'.format(u'ありがとう')
ありがとう