Python 将所有内容转换为Unicode

Python 将所有内容转换为Unicode,python,encoding,Python,Encoding,这里有什么区别?为什么一个有时似乎能工作,而另一个却不能 ''.join(unichr(i) for i in bytearray(string)) # vs unicode(string) which crashes sometimes 他们是否都应该成功地将bytestring转换为unicode字符串而不抛出任何错误?浏览您的示例: bytearray(b'hello \xab') 只不过是具有以下值的字节数组: >>> s = bytearray('hello \x

这里有什么区别?为什么一个有时似乎能工作,而另一个却不能

''.join(unichr(i) for i in bytearray(string)) # vs unicode(string) which crashes sometimes

他们是否都应该成功地将bytestring转换为unicode字符串而不抛出任何错误?

浏览您的示例:

bytearray(b'hello \xab')
只不过是具有以下值的字节数组:

>>> s = bytearray('hello \xab')
>>> for x in s:
...     x
... 
104
101
108
108
111
32
171    
unichr
获取Unicode代码点的编号(在压缩范围内,请参见@AdamSmith的注释)并返回相应的Unicode字符。您的示例中有趣的字节是171。Unicode代码点171(或十六进制:U+00AB)映射到字符«(也称为左指双角度引号)

请记住,Unicode不是将Unicode字符编码为字节。Unicode的核心只是整数到字符的映射。整数171恰好映射到字符«,这就是
unichr(171)
提供给您的

>>> print(unichr(171))
«
>>> u'\u00ab'
u'\xab'
>>> print(u'\u00ab')
«
unicode(somestring,encoding)
将尝试使用特定编码(默认为ascii)将字节解码为unicode码点。这里需要注意的关键是,并非所有字节序列都是有效的ascii、utf-8、utf-16等等

>>> unicode('hello', encoding='ascii')
u'hello'
没问题,“hello”可以用ascii码解码

>>> unicode('hello \xab', encoding='ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 6: ordinal not in range(128)

将8位bytestring转换为Unicode时,需要指定该数据的编码,因为可能使用了许多不同的编码。Python的
unicode
构造函数在默认情况下(在Python 2中)将使用
“ascii”
编解码器进行解码,因为ascii是7位编码,因此它将无法解码任何使用最高位的值


尝试使用
unicode(字符串,编码)
或可能更明确的
字符串。解码(编码)
其中
encoding
是数据的编码。使用
“latin-1”
编码将与
unichr
编码完全相同,因为Unicode的最低256个字符与8位latin-1字符集相同。你能举个例子吗?就像昨天一样,如果
string='hello\xab'
unicode
期望它的所有字符都是
0不,
''。join(unichr(x)代表bytearray(string)中的x)将给你与
unicode完全不同的结果(字符串,编码=右\u编码)
。unichar版本在大多数情况下只会产生错误的结果,您需要知道您的编码。因此,让我告诉您,
\xab
可能会根据原始编码产生不同的字符?Python的下一次迭代应该从Swift获得编码方面的提示。@MalikBrahimi是的,据您所知\xab可能意味着飞行奶牛根据我刚刚发明的FCE-8(飞牛编码)。好的,我完全理解。谢谢你的澄清。
>>> unicode('hello \xab', encoding='utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode byte 0xab in position 6: invalid start byte
>>> bytestr = u'☃'.encode('utf-8')
>>> bytestr
'\xe2\x98\x83'
>>> unicode(bytestr, encoding='utf-8')
u'\u2603'
>>> print(unicode(bytestr, encoding='utf-8'))
☃
>>> ''.join(unichr(x) for x in bytearray(bytestr))
u'\xe2\x98\x83'
>>> print(''.join(unichr(x) for x in bytearray(bytestr)))
â