这是令人震惊和非常沮丧的,请帮帮忙。
>>> a1 = '\xe5' # type <str>
>>> a2 = u'\xe5' # type <unicode>
>>> ord(a1)
229
>>> ord(a2)
229
>>> print a2.encode('utf-8')
å
>>> print a1.encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)如果a1和a2具有相同的值,为什么不能同时编码呢?
我必须使用一个在a1表单上返回unicode数据的外部API,这使得它毫无用处。Python显然坚持<str>类型的字符串只能包含ASCII字符,否则它会拒绝对其进行编码。它完全破坏了我的应用程序。
发布于 2017-04-24 04:38:41
您只能对Unicode字符串进行编码。如果在字节串上调用encode,Python会首先尝试使用默认编码对其进行解码-因此会出现错误。(请注意,这种令人困惑的行为只在Python 2中发生,它已经在Python 3中删除)。
发布于 2017-04-24 04:46:23
在python2中,字符串是ASCII码,而在python3中,字符串是Unicode。
ASCII字符的值只能介于0和127之间(包括0和127)。但是,Unicode字符可能具有更高的值。
python2
>>> a = '\x7f'
>>> a.encode('utf-8')
'\x7f'
>>> a = '\x80'
>>> a.encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)python3
>>> a = '\x7f'
>>> a.encode('utf-8')
b'\x7f'
>>> a = '\x80'
>>> a.encode('utf-8')
b'\xc2\x80'这在带有u前缀的python2中有效的原因是因为您显式地声明了“这是一个Unicode字符串”。
为了更深入地理解在python2中使用Unicode,可能值得一读。
要使用(中断的)接口,最好将返回的字符串转换为字节数组,但请注意,这在python3中不起作用。
>>> a = '\xe5'
>>> b = bytearray(a)
>>> b[0]
229请记住,\xe5不是有效的Unicode (UTF-8)字符...要在UTF-8编码的字符串中存储值0xE5,需要存储两个字节:0xC3 0xA5。
发布于 2017-04-24 05:00:52
让我把你的困惑撕成碎片吧。让我们首先从str和unicode之间的区别开始。在Python 2.x中:
str是一个8位字符(1字节)的字符串,只要有可能就会打印为ASCII码。str.unicode实际上是一个字节序列,等同于Python3.x中的str。*没有编码,因为bytes是一串Unicode代码点。第二,根据Python documentation的编码方式:
“将Unicode字符串转换为字节序列的规则称为编码。”
然后,问自己这个问题:对已经是字节序列的str进行编码有意义吗?答案是否定的。因为str已经是一个字节序列。然而,对unicode进行编码确实有意义,为什么?因为它是Unicode字符代码点的字符串(即,U+00E4')。
https://stackoverflow.com/questions/43576202
复制相似问题