Her zaman unicode'dan baytlara kodlayın .
Bu yönde kodlamayı seçersiniz .
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
Diğer yol, baytlardan unicode'a kod çözmektir.
Bu yönde kodlamanın ne olduğunu bilmelisiniz .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
Bu nokta yeterince vurgulanamaz. Unicode "köstebek vurma" oynamaktan kaçınmak istiyorsanız, veri düzeyinde neler olduğunu anlamak önemlidir. Burada başka bir şekilde açıklanıyor:
- Bir unicode nesnesinin kodu çözülmüştür, onu asla çağırmak istemezsiniz
decode.
- Bir bytestring nesnesi zaten kodlanmıştır, onu asla çağırmak istemezsiniz
encode.
Şimdi, .encodebir bayt dizesini gördükten sonra, Python 2 önce onu örtük olarak metne (bir unicodenesne) dönüştürmeye çalışır . Benzer şekilde, .decodebir unicode dizesini gördükten sonra, Python 2 örtük olarak onu bayta (bir strnesne) dönüştürmeye çalışır .
Alabileceğiniz neden Bunlar örtük dönüşümler dediğiniz zaman . Bunun nedeni, kodlamanın genellikle bir tür parametresini kabul etmesidir ; bir parametre alırken , başka bir kodlamayla yeniden kodlamadan önce bir nesne türünde örtük bir kod çözme vardır . Bu dönüştürme, varsayılan bir 'ascii' kod çözücüyü seçer † ve size bir kodlayıcı içinde kod çözme hatası verir.UnicodeDecodeErrorencodeunicodestrunicode
Aslında, Python 3'te yöntemler var str.decodeve bytes.encodeyok bile. Onların kaldırılması, bu yaygın kafa karışıklığını önlemek için [tartışmalı] bir girişimdi.
† ... veya kodlama ne sys.getdefaultencoding()diyorsa; genellikle bu "ascii" dir