>>> teststring = 'aõ'
>>> type(teststring)
<type 'str'>
>>> teststring
'a\xf5'
>>> print teststring
aõ
>>> teststring.decode("ascii", "ignore")
u'a'
>>> teststring.decode("ascii", "ignore").encode("ascii")
'a'
这是我真正希望它在内部存储,因为我删除非ascii字符。为什么解码(“ascii发出unicode字符串?
>>> teststringUni = u'aõ'
>>> type(teststringUni)
<type 'unicode'>
>>> print teststringUni
aõ
>>> teststringUni.decode("ascii" , "ignore")
Traceback (most recent call last):
File "<pyshell#79>", line 1, in <module>
teststringUni.decode("ascii" , "ignore")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf5' in position 1: ordinal not in range(128)
>>> teststringUni.decode("utf-8" , "ignore")
Traceback (most recent call last):
File "<pyshell#81>", line 1, in <module>
teststringUni.decode("utf-8" , "ignore")
File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf5' in position 1: ordinal not in range(128)
>>> teststringUni.encode("ascii" , "ignore")
'a'
这又是我想要的。 我不明白这种行为。有人可以向我解释这里发生了什么吗?
编辑我认为这样我会理解事情,所以我可以解决我在这里说的真正的程序问题: Converting Unicode objects with non-ASCII symbols in them into strings objects (in Python)
答案 0 :(得分:4)
为什么解码(“ascii”)会发出unicode字符串?
因为是decode
的所有内容:它将ASCII字节字符串解码为unicode。
在你的第二个例子中,你试图“解码”一个已经是unicode的字符串,这个字符串没有效果。但是,要将它打印到终端,Python必须将其编码为默认编码,即ASCII - 但由于您没有明确地执行该步骤,因此未指定'ignore'参数,因此会引发错误不能编码非ASCII字符。
所有这一切的技巧是记住decode
采用编码的字节串并将其转换为Unicode,而encode
则反过来。如果您了解 Unicode不是编码,可能会更容易。
答案 1 :(得分:4)
很简单:.encode将Unicode对象转换为字符串,而.decode将字符串转换为Unicode。