终端中的Python字符处理

时间:2014-11-04 22:18:11

标签: python unicode character-encoding terminal output

我在交互式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"ü"
ü

2 个答案:

答案 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'