Sorunuz yanlış; gördüğünüz hata, python'u nasıl oluşturduğunuzun değil, bayt dizeleri ve unicode dizeleri arasındaki karışıklığın sonucudur.
Bayt dizeleri (örneğin, python sözdiziminde "foo" veya "bar") sekizli dizileridir; 0-255 arası sayılar. Unicode dizeleri (örn. U "foo" veya u'bar '), unicode kod noktalarının dizileridir; 0-1112064 arasındaki numaralar. Ancak, (terminalinizde) tek bir karakteri temsil eden çok baytlık bir sıra olan é karakteriyle ilgileniyorsunuz.
Bunun yerine şunu ord(u'é')
deneyin:
>>> [ord(x) for x in u'é']
Bu, hangi kod noktaları dizisinin "é" yi temsil ettiğini gösterir. Size verebilir [233] veya size verebilir [101, 770].
chr()
Bunu tersine çevirmek yerine unichr()
:
>>> unichr(233)
u'\xe9'
Bu karakter aslında tek veya çoklu unicode "kod noktaları" olarak temsil edilebilir ve bunlar kendileri grafik veya karakterleri temsil eder. "Akut aksanlı (yani kod noktası 233)" veya "e" (kod noktası 101), ardından "önceki karakterde akut aksan" (kod noktası 770). Dolayısıyla bu aynı karakter Python veri yapısı u'e\u0301'
veya u'\u00e9'
.
Çoğu zaman bununla ilgilenmek zorunda kalmamalısınız, ancak unicode dize üzerinde yineleme yapıyorsanız, yineleme ayrıştırılabilir karakterle değil, kod noktasına göre çalışır. Başka bir deyişle, len(u'e\u0301') == 2
ve len(u'\u00e9') == 1
. Bu sizin için önemliyse, kullanarak oluşturulmuş ve ayrıştırılmış formlar arasında dönüştürme yapabilirsiniz unicodedata.normalize
.
Unicode Sözlüğü , her bir özel terimin, metin gösteriminin birçok programcının fark ettiğinden çok daha karmaşık olan farklı bir bölümünü nasıl ifade ettiğini göstererek bu sorunların bazılarını anlamak için yararlı bir rehber olabilir.