我在交互式Python 2.7终端中(终端默认输出是" utf-8")。我有一个来自互联网的字符串,我们称之为a
>>> a
u'M\xfcssen'
>>> a[1]
u'\xfc'
我想知道为什么它的值不是ü
所以我试试
>>> print(a)
Müssen
>>> print(a[1])
ü
按预期工作。
所以我的第一个问题是print a
做了什么,只要输入a
就会丢失?
出于好奇:为什么我在同一个python终端会话中获得以下输出?
>>> "ü"
'\xc3\xbc'
>>> print "ü"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
>>> print u"ü"
ü
答案 0 :(得分:1)
,这会丢失
print a
做了什么,如果我只输入a
?
交互式>>>
提示符使用值的Python源代码表示输出值,由repr()
函数返回。这就是为什么你不只是为\xFC
字符ü
而且还在字符串周围引用标记。提示符试图向您显示您需要输入Python程序以获取您拥有的字符串值。
print
语句输出值的原始字符串转换,由str()
函数返回。
对于某些类型repr()
和str()
生成相同的输出,但字符串不是这种情况。
答案 1 :(得分:1)
您必须了解python如何存储各种数据类型以及哪些函数需要哪些输入。这一切都很混乱,也取决于您终端的LOCALE设置。
以下链接可能有助于减少混淆:https://pythonhosted.org/kitchen/unicode-frustrations.html
str
之类的所有"My String"
个对象都存储为每个字符8位。在您的情况下,'\xc3\xbc'
是UMLAUT-U的utf8表示形式,作为str
对象。
对于unicode
个对象,python使用16位或32位整数来存储字符串。
现在print
函数需要str
个对象作为输入。这就是为什么以下工作的原因。
>>> print '\xc3\xbc'
ü
将UMLAUT-U从str
转换为unicode
对象。你必须告诉python,在将字符串转换为unicode
对象之前,该字符串是UTF8表示形式。
>>> unicode('\xc3\xbc'.decode('utf8'))
u'\xfc'