我只想尝试解码\ uXXXX \ uXXXX \ uXXXX之类的字符串。但是我收到了一个错误:
$ python
Python 2.7.6 (default, Sep 9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print u'\u041e\u043b\u044c\u0433\u0430'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
我是Python新手。有什么问题?谢谢!
答案 0 :(得分:19)
Python正试图提供帮助。您无法解码 Unicode数据,它已经被解码。所以Python首先会编码数据(使用ASCII编解码器)来获取要解码的字节。这种隐式编码失败了。
如果你有Unicode数据,只有编码到UTF-8才有意义,而不是解码:
>>> print u'\u041e\u043b\u044c\u0433\u0430'
Ольга
>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8')
'\xd0\x9e\xd0\xbb\xd1\x8c\xd0\xb3\xd0\xb0'
如果您想要Unicode值,那么您需要使用Unicode文字(u'...'
)。无需进一步解码。
同样的隐式转换发生在另一个方向;如果您尝试编码字节字符串,则会触发隐式解码:
>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8').encode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
答案 1 :(得分:13)
您可以设置默认编码utf-8。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')