2016-04-01 39 views
-2

, ben iki soru var çıkışkodlama unicode kullanarak UTF-8 Python

('\xe2\x82\xac', <type 'str'>, 3) 

olduğunu

euro = u'\u20AC' 
euroUTF8 = euro.encode('utf-8') 
print(euroUTF8, type(euroUTF8), len(euroUTF8)) 

yazarsanız: o euroUTF8 benziyor 1. 3 bayt üzerinde kodlanan, ama kaç biti içerdiğini görmek için ikili gösterimini nasıl alabilirim? 2. '\xe2\x82\xac''x' ne anlama geliyor? 'x''un bir hex sayısı olduğunu düşünmüyorum. Ve neden üç tane '\' var?

cevap

3

Python 2'de print bir işlevdir, bir işlev değil. Burada tuple yazıyorsunuz. kaldırarak tek tek öğeleri yazdır (..):

>>> euro = u'\u20AC' 
>>> euroUTF8 = euro.encode('utf-8') 
>>> print euroUTF8, type(euroUTF8), len(euroUTF8) 
€ <type 'str'> 3 

Şimdi stdout'a dizeleri olarak yazılır 3 ayrı nesneler olsun; terminalim, UTF-8 olarak yazılan herhangi bir şeyi yorumlayacak şekilde yapılandırılmış olur, bu nedenle baytlar, görüntülenen Euro sembolünün doğru bir şekilde sonuçlanmasını sağlar.

\x<hh> dizileri Python dize kaçış dizileri (reference documentation bakın); Bunlar, ASCII olmayan, yazdırılamayan baytlar içeren bir dizeye uygulanan repr() için varsayılan çıktılardır. interaktif bir tercüman değeri yankılanan zaman aynı şeyi görürsünüz:

>>> euroUTF8 
'\xe2\x82\xac' 
>>> euroUTF8[0] 
'\xe2' 
>>> euroUTF8[1] 
'\x82' 
>>> euroUTF8[2] 
'\xac' 

Bunlar ASCII güvenli ayıklama çıkışı sağlamak. Tüm Python standart kütüphane kaplarının içeriği bu formatı kullanır; listeler, tuples ve sözlükler dahil.

Eğer bu değerleri oluşturan bit görmek ord() fonksiyonunu kullanarak bir tam sayıya her byte dönüştürmek biçimlendirmek istiyorsanız, o zaman ikili olarak tamsayı biçimlendirmek:

>>> ' '.join([format(ord(b), '08b') for b in euroUTF8]) 
'11100010 10000010 10101100' 
0
  1. Her harfin Her kodlamada farklı sayıda bit kullanılarak temsil edilir. UTF-8, 8 bitlik bir kodlamadır, bu yüzden her bir karakterin her bit sayisini bilmek için ikili bir gösterim elde etmeye gerek yoktur. (Eğer hala bitleri sunmak isterseniz, Martijn'in cevabına bakın.)

  2. \x, aşağıdaki değerin bir bayt olduğu anlamına gelir. Yani x, dönüştürmeniz veya okumanız gereken bir hex numarası gibi bir şey değildir. İlgilendiğiniz aşağıdaki değeri tanımlar. \ 'lar, x' un kaçmak için kullanılır, çünkü bunlar değerin bir parçası değildir.