Unicode ve kodlamalar tamamen farklı, ilgisiz şeylerdir.
Unicode
Her karaktere sayısal bir kimlik atar:
- 0x41 → A
- 0xE1 → á
- 0x414 → Ä
Bu nedenle, Unicode 0x41 sayısını A'ya, 0xE1'i á'ya ve 0x414'ü Д'ye atar.
Kullandığım küçük ok bile Unicode numarasına sahip, 0x2192. Ve emojilerin bile kendi Unicode numaraları vardır, 😂 0x1F602'dir.
Bu tablodaki tüm karakterlerin Unicode numaralarına bakabilirsiniz . Özellikle yukarıdaki ilk üç karakteri burada , oku burada ve emojiyi burada bulabilirsiniz .
Tüm karakterlere Unicode tarafından atanan bu numaralara kod noktaları denir .
Tüm bunların amacı, her bir karaktere açık bir şekilde atıfta bulunmak için bir yol sağlamaktır. Örneğin, 😂'den bahsediyorsam, "bilirsiniz, gözyaşlarıyla bu gülen emoji" demek yerine, sadece Unicode kod noktası 0x1F602 diyebilirim . Daha kolay, değil mi?
Unicode kod noktalarının genellikle bir satır aralığı ile biçimlendirildiğini U+
, ardından onaltılık sayısal değerin en az 4 haneye kadar doldurulduğunu unutmayın. Dolayısıyla, yukarıdaki örnekler U + 0041, U + 00E1, U + 0414, U + 2192, U + 1F602 olacaktır.
Unicode kod noktaları U + 0000 ile U + 10FFFF arasındadır. Bu 1,114,112 sayıdır. Bu sayıların 2048'i vekiller için kullanıldı , dolayısıyla 1.112.064 kaldı. Bu, Unicode'un 1.112.064 farklı karaktere benzersiz bir kimlik (kod noktası) atayabileceği anlamına gelir. Bu kod noktalarının tümü henüz bir karaktere atanmamıştır ve Unicode sürekli olarak genişletilir (örneğin, yeni emojiler sunulduğunda).
Unicode'un yaptığı tek şey, kolay ve kesin referans için her karaktere kod noktası adı verilen sayısal bir kimlik atamaktır.
Kodlamalar
Karakterleri bit desenleriyle eşleyin.
Bu bit desenleri, bilgisayar belleğindeki veya diskteki karakterleri temsil etmek için kullanılır.
Farklı karakter alt kümelerini kapsayan birçok farklı kodlama vardır. İngilizce konuşulan dünyada en yaygın kodlamalar şunlardır:
Harita 128 karakter uzunluğunda 7 bit kalıplarına (U 007F için kod noktaları U +, 0000).
Misal:
Bu tablodaki tüm eşlemeleri görebilirsiniz .
Harita 191 karakter uzunluğunda 8 bit kalıplarına (U 0020 U +, 00FF U + 007E ve u + 00A0 kod noktası).
Misal:
- a → 01100001 (0x61)
- á → 11100001 (0xE1)
Bu tablodaki tüm eşlemeleri görebilirsiniz .
Harita 1.112.064 karakter ya da uzunluğu 8, 16, 24, veya 32 bitlik bit kalıpları (bütün mevcut Unicode kod noktası) (yani, 1, 2, 3, ya da 4 bayt).
Misal:
- a → 01100001 (0x61)
- á → 11000011 10100001 (0xC3 0xA1)
- ≠ → 11100010 10001001 10100000 (0xE2 0x89 0xA0)
- 😂 → 11110000 10011111 10011000 10000010 (0xF0 0x9F 0x98 0x82)
UTF-8'in karakterleri bit dizelerine kodlama yöntemi burada çok iyi açıklanmıştır .
Unicode ve Kodlamalar
Yukarıdaki örneklere bakıldığında, Unicode'un ne kadar kullanışlı olduğu netleşiyor.
Örneğin, Latin-1 isem ve á kodlamamı açıklamak istiyorsam şunu söylememe gerek yok:
"Bunu aigu ile kodluyorum (veya siz buna yükselen çubuk diyorsunuz) 11100001"
Ama şunu söyleyebilirim:
"U + 00E1'i 11100001 olarak kodluyorum"
Ve UTF-8 isem şunu söyleyebilirim:
"Ben de sırayla, U + 00E1'i 11000011 10100001 olarak kodluyorum"
Ve hangi karakteri kastettiğimiz herkes için açık bir şekilde açıktır.
Şimdi sık sık ortaya çıkan kafa karışıklığına
Bazen bir kodlamanın bit deseninin, eğer onu bir ikili sayı olarak yorumlarsanız, bu karakterin Unicode kod noktasıyla aynı olduğu doğrudur.
Örneğin:
- ASCII kodlar bir onaltılık sayı olarak yorumlayabilir 1100001 gibi 0x61 ve Unicode kod noktası bir olan U +, 0061 .
- Latince-1 kodlar á Eğer on altılı sayı olarak yorumlayabilir 11100001 gibi 0XE1 ve Unicode kod noktası á olan U +, 00E1 .
Elbette kolaylık sağlamak amacıyla bu şekilde düzenlenmiştir. Ama buna saf bir tesadüf olarak bakmalısın . Bellekteki bir karakteri temsil etmek için kullanılan bit deseni, bu karakterin Unicode kod noktasına hiçbir şekilde bağlı değildir.
Hiç kimse 11100001 gibi bir bit dizgesini ikili sayı olarak yorumlamanız gerektiğini bile söylemiyor. Latin-1'in á karakterini kodlamak için kullandığı bit dizisi olarak bakın .
Sorunuza geri dönün
Python yorumlayıcınız tarafından kullanılan kodlama UTF-8'dir .
Örneklerinizde neler olduğu:
örnek 1
Aşağıdaki, UTF-8'de á karakterini kodlamaktadır. Bu, değişkene kaydedilen 11000011 10100001 bit dizesiyle sonuçlanır a
.
>>> a = 'á'
Eğer değerine baktığımızda a
içeriği, 11000011 10100001 olarak altıgen numarası 0xC3 0xA1 ve çıktı olarak biçimlendirilir '\xc3\xa1'
:
>>> a
'\xc3\xa1'
Örnek 2
Aşağıdakiler, U + 00E1 olan á'nın Unicode kod noktasını değişkene ua
kaydeder (Python'un bellekte U + 00E1 kod noktasını temsil etmek için dahili olarak hangi veri biçimini kullandığını bilmiyoruz ve bu bizim için önemsizdir):
>>> ua = u'á'
Eğer değerine baktığımızda ua
Python onun kod noktası U + 00E1 içerdiğini anlatır:
>>> ua
u'\xe1'
Örnek 3
Aşağıdaki kod noktası U + 00E1'i (karakter á'yı temsil eden) UTF-8 ile kodlar ve bu da 11000011 10100001 bit modeliyle sonuçlanır. Yine çıktı için bu bit modeli onaltılık sayı 0xC3 0xA1 olarak temsil edilir:
>>> ua.encode('utf-8')
'\xc3\xa1'
Örnek 4
Aşağıdaki kodlar Unicode kod noktası Latin-1, çıkış için bir bit dizisini 11100001. sonuçlanır bu bit şeklinin uygulanması heks numarası 0XE1 olarak temsil edilir U + 00E1 (temsil karakteri bir) tesadüfen ilk aynıdır kod noktası U + 00E1:
>>> ua.encode('latin1')
'\xe1'
Unicode nesnesi ua
ile Latin-1 kodlaması arasında bir ilişki yoktur . Á'nın kod noktasının U + 00E1 ve á'nın Latin-1 kodlamasının 0xE1 olması (kodlamanın bit modelini ikili sayı olarak yorumlarsanız) tamamen bir tesadüftür.
unicode
o unicode karakter sadece bir soyutlama var; bazı kodlamalarlaunicode
dönüştürülebilirstr
(örneğinutf-8
).