Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UnicodeEncodeError:&x27;ascii';编解码器可以';t编码位置0-5的字符:序号不在范围内(128)_Python_Python 2.7_Utf 8_Decode - Fatal编程技术网

Python UnicodeEncodeError:&x27;ascii';编解码器可以';t编码位置0-5的字符:序号不在范围内(128)

Python UnicodeEncodeError:&x27;ascii';编解码器可以';t编码位置0-5的字符:序号不在范围内(128),python,python-2.7,utf-8,decode,Python,Python 2.7,Utf 8,Decode,我只是想解码类似于\uxxx\uxxx\uxxx的字符串。但我有一个错误: $ 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

我只是想解码类似于\uxxx\uxxx\uxxx的字符串。但我有一个错误:

$ 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
Python 2.7.6(默认,2014年9月9日,15:04:36)
[GCC 4.2.1达尔文兼容苹果LLVM 6.0(clang-600.0.39)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>打印u'\u041e\u043b\u044c\u0433\u0430'。解码('utf-8')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py”,第16行,解码
返回编解码器.utf_8_解码(输入,错误,真)
UnicodeEncodeError:“ascii”编解码器无法对位置0-4中的字符进行编码:序号不在范围内(128)

我是Python新手。有什么问题吗?谢谢

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'…'
)。不需要进一步解码

相同的隐式转换发生在另一个方向;如果尝试对bytestring进行编码,则会触发隐式解码:

>>> 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)
>>u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8').encode('utf8'))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeDecodeError:“ascii”编解码器无法解码位置0中的字节0xd0:序号不在范围内(128)

您可以设置默认编码utf-8

import sys  
reload(sys)  
sys.setdefaultencoding('utf-8')

为什么要对已经解码的数据进行解码?问题是您使用的是Python 2,在Unicode字符串上有一个欺骗的
.decode
方法。使用
python3
,问题就会神奇地消失,就像
u.一样。解码将导致
AttributeError:'str'对象没有属性“decode”
。实际上我使用
msg=msg+u“@id%s(%s)\n”%(u[“id”]、u[“first\u name”]。编码('utf8'))
print msg
code>。它在
print
子句中给了我一个错误。@SergiiMatrunchyk:但你的问题不是这个。您的终端或控制台是否正确配置为处理您试图打印的字符?@SergiiMatrunchyk:另外,为什么要编码然后插入到unicode字符串中?如果要将这些值放入一个
u'…'
unicode对象中,则不应对插入的值进行编码。这是个坏主意。对于不懂编码的人来说,这是一个令人讨厌的黑客行为:感谢阿拉斯泰尔·麦科马克(Alastair McCormack)的建议不要使用此解决方案
sys.setdefaultencoding
被从模块中删除是有原因的,更改Python 2的隐式默认编码可能会破坏依赖正常行为的第三方库。尝试太多,最终这个答案救了我!谢谢。:)