为什么unicode字符串不能与python中的字节字符串进行比较?

Omp*_*ash 1 python unicode python-3.x

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

tri*_*eee 5

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

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

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

简要地,引用Stack Overflow character-encoding标签信息页面

就像将字体从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'?'
Run Code Online (Sandbox Code Playgroud)