SORU
1 Mayıs 2009, Cuma


Herhangi bir frikiklerinden Python 2.6 unicode_literals kullanarak?

Zaten kod tabanı Python 2.6 altında çalışan aldık. Python için hazırlamak için, 3.0, biz eklemeye başladı:

from __future__ import unicode_literals

.py dosyalarımızı biz onları değiştirmek gibi. Başka biri bu işi yapıyor ve çok açık olmayan herhangi bir frikiklerinden içine (çok fazla hata ayıklama zaman geçirdikten sonra belki) çalışma var mı merak ediyorum.

CEVAP
5 Mayıs 2009, Salı


Unicode dizeleri ile çalıştığımız sorunların ana kaynağı mix utf-8 unicode olanlar ile kodlanmış dizeleri.

Örneğin, aşağıdaki komut düşünün.

two.py

# encoding: utf-8
name = 'helló wörld from two'

one.py

# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name   two.name

python one.py çalışan çıktı

Traceback (most recent call last):
  File "one.py", line 5, in <module>
    print name   two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)

İthal etmedi çünkü bu örnekte, two.name utf-8 kodlanmış bir dize () unicode değil* *14 one.name unicode dize. Her iki karışımı, python ile kodlanmış dize (ascıı varsayarak) şifresini çözmek ve unicode ve başarısız dönüştürmek için çalışır. Eğer 16 ** yaparsan işe yarar.

Aynı şey bir dize kodlamak ve daha sonra bunları birleştirmeye çalışıyorum oluşabilir. Örneğin, bu gibi çalışır:

# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
    html = html.encode('utf-8')
print 'DEBUG: %s' % html

Çıkış:

DEBUG: <html><body>helló wörld</body></html>

Ama import unicode_literals ekledikten sonra DEĞİL:

# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
    html = html.encode('utf-8')
print 'DEBUG: %s' % html

Çıkış:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)

'DEBUG: %s' html kod çözme unicode dize ve bu nedenle python çalışır bir olduğu için başarısız olur. Yazdırma düzeltmek için birkaç yol print str('DEBUG: %s') % html print 'DEBUG: %s' % html.decode('utf-8') da yapıyorsun.

Bu unicode dizeleri kullanırken potansiyel sorunlar anlamanıza yardımcı olur umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • Trulia

    Trulia

    29 Kasım 2006