在使用str.center()时遇到unicode字符的问题

3 投票
2 回答
1167 浏览
提问于 2025-04-16 21:31

我注意到在 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 中运行得很好]

2 个回答

2

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们需要把它们转换成程序能用的格式。这种转换的过程就叫做“解析”。

解析的方式有很多种,具体取决于数据的类型和来源。例如,如果我们从一个网页上获取数据,可能需要把网页的内容提取出来,变成我们可以使用的格式。又或者,如果我们从一个文件中读取数据,可能需要根据文件的格式来解析里面的内容。

总之,解析就是把复杂的数据变得简单易懂,让程序能够顺利地使用这些数据。

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

# returns: '..─..'
3

在Python 2中,strunicode是两种不同的类型。str是字节的序列,用普通的引号创建。比如你的'─'就是一个包含3个字节的序列,它显示为一个单独的unicode字符。当你用str.center()方法让这些字节在5个字节宽的区域中居中时,它会在两边各加一个字节;但是打印出来时你只会看到3个字符。

如果你创建一个unicode对象(用u'─'或者'─'.decode('utf-8')),那么你就有了一个包含1个unicode字符的序列,这样在居中时会在两边各加2个字符。

在Python 3中就没有这个问题,因为普通字符串就是unicode字符的序列。

撰写回答