2016-04-12 33 views

cevap

6

Python 2, bytestrings ve unicode değerlerini dikkate alır. Bu arada, bunun içerdiği tuple ile ilgisi yok. Bunun yerine, aşağıda açıklayacağım örtülü bir tür dönüşüm ile ilgilidir.

O kadar gerçekten başlık altında neler olup bittiğini görmek için, 'kolay' ASCII codepoints ile göstermek için, daha yüksek codepoints kullanarak bir başarısızlık sebep olabilir zordur: Bir unicode ve bayt görünce

>>> bites = u'Ç'.encode('utf-8') 
>>> unikode = u'Ç' 
>>> print bites 
Ç 
>>> print unikode 
Ç 
>>> bites == unikode 
/Users/wim/Library/Python/2.7/bin/ipython:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
    #!/usr/bin/python 
False 

Yukarıdaki karşılaştırmada, python, baytların sys.getdefaultencoding() (platformumda 'ascii') ile kodlanmış olduğu varsayımını yaparak bir unicode nesnesine tiksellemeyi örtülü olarak denemiştir.

Yukarıda gördüğüm durumda, bu başarısız oldu çünkü baytlar utf-8'de kodlandı. Şimdi, bu "iş" yapalım:

>>> bites = u'Ç'.encode('ISO8859-1') 
>>> unikode = u'Ç' 
>>> import sys 
>>> reload(sys) # please don't ever actually use this hack, guys 
<module 'sys' (built-in)> 
>>> sys.setdefaultencoding('ISO8859-1') 
>>> bites == unikode 
True 

Kişisel üst değişim hemen hemen aynı şekilde, ancak bir 'ASCII' codec'i kullanarak "çalışır". Baytlar ve unicode arasındaki bu türden gizli dönüşümler aslında oldukça kötülüktür ve çok fazla pain'a neden olabilir, bu yüzden Python 3'te bunları yapmayı bırakmaya karar verildi çünkü "açık, örtük olmaktan iyidir".

Python 3+ sürümünde, kodunuz aslında hem Unicode dize değişmezlerini temsil ediyor, hem de her ikisi de eşittir. Önek sessizce göz ardı edilir. Python3'te bir bytestring literal istiyorsanız, b'this' gibi belirtmeniz gerekir. Daha sonra 1) açık bir şekilde baytları çözmeyi istersiniz veya 2) bir karşılaştırma yapmadan önce unicode nesnesini açıkça kodlayın.

+2

Detaylı açıklama için çok teşekkür ederim. – smwikipedia