使用str.center()函数处理Unicode字符时出现问题

3

我在Python 2.7中观察到了str对象的center方法的奇怪行为 -

>>> print '-'.center(5,'.')        # '-' is the minus or hyphen key on the keyboard.
..-..                              # correctly centered
>>> print '─'.center(5, '.')       # '─' is NOT the minus or hyphen key on the keyboard.
.─.                                # incorrectly centered

这是center方法实现的一个错误还是与使用Unicode字符有关?
我该如何解决这个问题?

[请注意,在Python 3.2中,这个方法可以完美地工作]


1
你尝试过使用 u"─" 吗?你当前使用的字符在UTF-8中占用了3个字节。 - Wooble
u"─"有效。谢谢。但我想知道这种奇怪行为的原因。请把原因作为答案,我会给你点赞。 - Pushpak Dagade
2个回答

3
在Python 2中,有一个区分strunicode类型的差别。一个str是一系列字节,并使用未修改的引号创建。你的'─'创建了一个由3个字节组成的序列,显示为单个Unicode字符;当你要求str.center()将这些字节居中在5字节宽的字段中时,在每侧添加一个单独的字节;打印时只会得到3个字形。
如果你创建一个unicode对象(用u'─'或'─'.decode('utf-8')),现在你有了一个由1个Unicode字符组成的序列,将通过在每侧添加2个字符来居中。
Python 3没有这个问题,因为普通字符串是Unicode字符序列。

2
print '─'.decode('utf-8').center(5, '.')  

# returns: '..─..'

我能知道为什么不使用“decode”会出现这种奇怪的行为吗?也就是说,为什么它会给出错误的输出而不是报错? - Pushpak Dagade
它不会按照你想要的方式解释 '─'。 - eumiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接