【发布时间】:2015-10-24 15:26:14
【问题描述】:
我观察到以下情况:
>>> print '£' + '1'
£1
>>> print '£' + u'1'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
>>> print u'£' + u'1'
£1
>>> print u'£' + '1'
£1
为什么'£' + '1' 有效但'£' + u'1' 无效?
我查看了类型:
>>> type('£' + '1')
<type 'str'>
>>> type('£' + u'1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
>>> type(u'£' + u'1')
<type 'unicode'>
这也让我感到困惑。如果'£' + '1' 是str 而不是unicode,为什么它可以在我的终端上正确打印?它不应该打印类似'\xc2\xa31'?
此外,我还观察到以下几点:
>>> u'£' + '1'
u'\xa31'
>>> type('1')
<type 'str'>
>>> type(u'£')
<type 'unicode'>
>>> print u'£' + '1'
£1
为什么u'£' + '1' 不能正确打印出£ 符号,而print u'£' + '1' 可以?是不是因为前者用了repr,而后者用了str?
另外,unicode 和 str 的串联在这种情况下如何工作,而在 '£' + u'1' 情况下却不行?
【问题讨论】:
-
Afaik 你只能连接相同类型的字符串,即
u'£'+u'1'或'£'+'1'。你不能混合它们。 -
您正尝试使用
print '£' + u'1'解码为ascii,打印时您永远不会看到'\xc2\xa31',除非您打印对象的repr,print '£' + '1'有效,因为您的shell配置为接受 utf-8 -
@Bjorn 可以,我做过很多次了,看更新的问题
-
男孩,你真的击中了所有的重复项。我应该把它作为一个关闭。
-
@MartijnPieters 很抱歉,你能指点我吗?
标签: python unicode string-concatenation