为什么在python中无法将unicode字符串与字节字符串进行比较?

时间:2018-07-21 02:01:48

标签: python python-3.x unicode

从Pattern python文档中,我看到“无法将Unicode字符串与字节字符串进行比较”,但是为什么呢? 您可以在此处阅读以下行:https://github.com/python/cpython/blob/3.5/Lib/re.py

1 个答案:

答案 0 :(得分:5)

Python 3引入了一个有争议的更改,其中所有Python字符串都是Unicode字符串,并且所有字节字符串都必须具有指定的编码,然后才能转换为Unicode字符串。

这与Python的“显式优于隐式”原理相吻合,并消除了许多潜在的错误,这些错误在程序员不小心或不了解其含义时隐式转换会悄悄地产生错误或损坏的结果。

与此相反,除非您正确理解模型,否则很难编写混合Unicode和字节字符串的代码。 (嗯,以前也很困难;但是被遗忘的程序员仍然如此,并认为他们的代码可以正常工作,直到有人对其进行了适当的测试。现在他们可以预先得到错误。)

简而言之,引用the Stack Overflow character-encoding tag info page

  

就像将字体从Arial更改为Wingdings一样   更改文字的外观,   更改编码会影响解释   字节序列。   例如,根据编码,   字节0xE2 0x89 0xA0可以代表   Windows代码页1252中的文本â‰,   或KOI8-R中的Б┴═,   或UTF-8中的字符

Python 2会在幕后做一些不明显的事情,以强制将此字节字符串转换为本地字符串,这取决于上下文,可能涉及本地系统的“默认编码”,从而在不同的系统上产生不同的结果,从而产生了相当大的难度错误。 Python 3要求您明确说明如果要将字节转换为字符串,应如何解释字节。

bytestr = b'\xE2\x89\xA0' 
fugly = bytestr.decode('cp1252')  # u'≠'
cyril = bytestr.decode('koi8-r')  # u'Б┴═' 
wtf_8 = bytestr.decode('utf-8')   # u'≠'