我使用的是交互式 Python 2.7 终端(终端默认输出为“utf-8”)。我有一个来自互联网的字符串,我们称之为 a
>>> a
u'M\xfcssen'
>>> a[1]
u'\xfc'
我想知道为什么它的值不是ü
所以我尝试
>>> print(a)
Müssen
>>> print(a[1])
ü
按预期工作。
所以我的第一个问题是,如果我只输入a
,print a
会丢失什么?
出于好奇:为什么我在同一个 python 终端 session 中得到以下输出?
>>> "ü"
'\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"ü"
ü
最佳答案
您必须了解 python 如何存储各种数据类型以及哪些函数需要哪些输入。这一切都非常令人困惑,并且还取决于您终端的 LOCALE 设置。
以下链接可能有助于减少困惑:https://pythonhosted.org/kitchen/unicode-frustrations.html
所有 str
对象(例如 "My String"
)都存储为每个字符 8 位。在您的情况下, '\xc3\xbc'
是 UMLAUT-U 作为 str
对象的 utf8 表示形式。
对于unicode
对象,Python使用16位或32位整数来存储字符串。
现在,print
函数需要 str
对象作为输入。这就是为什么下面的方法有效。
>>> print '\xc3\xbc'
ü
将 UMLAUT-U 从 str
转换为 unicode
对象。在将字符串转换为 unicode
对象之前,您必须告诉 python 该字符串采用 UTF8 表示形式。
>>> unicode('\xc3\xbc'.decode('utf8'))
u'\xfc'
关于终端中的 Python 字符处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26746127/