Unicode dan pengkodean sama sekali berbeda, hal-hal yang tidak terkait.
Unicode
Menetapkan ID numerik untuk setiap karakter:
- 0x41 → A
- 0xE1 → á
- 0x414 → Д
Jadi, Unicode memberikan angka 0x41 ke A, 0xE1 ke á, dan 0x414 ke Д.
Bahkan panah kecil → yang saya gunakan memiliki nomor Unicode-nya, 0x2192. Dan bahkan emoji memiliki nomor Unicode, 😂 adalah 0x1F602.
Anda dapat mencari nomor Unicode dari semua karakter di tabel ini . Secara khusus, Anda dapat menemukan tiga karakter pertama di atas di sini , panah di sini , dan emoji di sini .
Nomor-nomor ini ditetapkan ke semua karakter oleh Unicode disebut poin kode .
Tujuan dari semua ini adalah untuk menyediakan sarana untuk secara jelas mengacu pada setiap karakter. Misalnya kalau saya ngomongin 😂, daripada bilang "kamu tahu, emoji tertawa ini berlinang air mata" , saya cukup bilang, titik kode Unicode 0x1F602 . Lebih mudah, bukan?
Perhatikan bahwa titik kode Unicode biasanya diformat dengan awalan U+
, kemudian nilai numerik heksadesimal ditambahkan ke setidaknya 4 digit. Jadi, contoh di atas adalah U + 0041, U + 00E1, U + 0414, U + 2192, U + 1F602.
Poin kode unicode berkisar dari U + 0000 hingga U + 10FFFF. Itu adalah 1.114.112 angka. 2048 dari angka-angka ini digunakan sebagai pengganti , jadi masih ada 1.112.064. Ini berarti, Unicode dapat menetapkan ID unik (titik kode) ke 1.112.064 karakter berbeda. Belum semua poin kode ini ditetapkan ke sebuah karakter, dan Unicode diperpanjang terus menerus (misalnya, saat emoji baru diperkenalkan).
Hal penting yang harus diingat adalah bahwa semua yang dilakukan Unicode adalah menetapkan ID numerik, yang disebut titik kode, ke setiap karakter untuk referensi yang mudah dan tidak ambigu.
Pengodean
Memetakan karakter ke pola bit.
Pola bit ini digunakan untuk mewakili karakter dalam memori komputer atau pada disk.
Ada banyak pengkodean berbeda yang mencakup himpunan bagian karakter yang berbeda. Di dunia berbahasa Inggris, penyandiaksaraan yang paling umum adalah sebagai berikut:
Peta karakter 128 (poin kode U + 0000 untuk U + 007F) ke pola bit panjang 7.
Contoh:
Anda dapat melihat semua pemetaan di tabel ini .
Peta karakter 191 (kode poin U + 0020 untuk U + 007E dan U + 00A0 untuk U + 00FF) ke pola bit panjang 8.
Contoh:
- a → 00.00001 (0x61)
- á → 11100001 (0xE1)
Anda dapat melihat semua pemetaan di tabel ini .
Maps 1.112.064 karakter (semua yang ada Unicode kode poin) ke pola bit baik panjang 8, 16, 24, atau 32 bit (yaitu, 1, 2, 3, atau 4 byte).
Contoh:
- a → 00.00001 (0x61)
- á → 11000011 10100001 (0xC3 0xA1)
- ≠ → 11100010 10001001 10100000 (0xE2 0x89 0xA0)
- 😂 → 11110000 10011111 10011000 10000010 (0xF0 0x9F 0x98 0x82)
Cara UTF-8 mengkodekan karakter menjadi string bit dijelaskan dengan sangat baik di sini .
Unicode dan Encoding
Melihat contoh di atas, menjadi jelas bagaimana Unicode berguna.
Misalnya, jika saya Latin-1 dan saya ingin menjelaskan pengkodean saya untuk á, saya tidak perlu mengatakan:
"Saya menyandikannya dengan aigu (atau bagaimanapun Anda menyebutnya bilah naik) sebagai 11100001"
Tapi saya hanya bisa mengatakan:
"Saya menyandikan U + 00E1 sebagai 11100001"
Dan jika saya UTF-8 , saya dapat mengatakan:
"Saya, pada gilirannya, saya menyandikan U + 00E1 sebagai 11000011 10100001"
Dan sangat jelas bagi semua orang karakter mana yang kami maksud.
Sekarang untuk kebingungan yang sering timbul
Memang benar bahwa terkadang pola bit pengkodean, jika Anda menafsirkannya sebagai bilangan biner, sama dengan titik kode Unicode dari karakter ini.
Sebagai contoh:
- ASCII mengkodekan suatu sebagai 1100001, yang Anda dapat menafsirkan sebagai angka heksadesimal 0x61 , dan titik kode Unicode dari suatu adalah U + 0061 .
- Latin-1 menyandikan á sebagai 11100001, yang dapat Anda tafsirkan sebagai angka heksadesimal 0xE1 , dan titik kode Unicode dari á adalah U + 00E1 .
Tentu saja, ini sengaja diatur seperti ini untuk kenyamanan. Tetapi Anda harus melihatnya sebagai kebetulan belaka . Pola bit yang digunakan untuk merepresentasikan karakter dalam memori tidak terikat dengan cara apa pun ke titik kode Unicode dari karakter ini.
Bahkan tidak ada yang mengatakan bahwa Anda harus menafsirkan string bit seperti 11100001 sebagai bilangan biner. Lihat saja sebagai urutan bit yang digunakan Latin-1 untuk menyandikan karakter á .
Kembali ke pertanyaan Anda
Pengkodean yang digunakan oleh penerjemah Python Anda adalah UTF-8 .
Inilah yang terjadi dalam contoh Anda:
Contoh 1
Berikut ini mengkodekan karakter á dalam UTF-8. Ini menghasilkan string bit 11000011 10100001, yang disimpan dalam variabel a
.
>>> a = 'á'
Saat Anda melihat nilai a
, isinya 11000011 10100001 diformat sebagai nomor hex 0xC3 0xA1 dan keluarannya sebagai '\xc3\xa1'
:
>>> a
'\xc3\xa1'
Contoh 2
Yang berikut ini menyimpan titik kode Unicode dari á, yaitu U + 00E1, dalam variabel ua
(kami tidak tahu format data mana yang digunakan Python secara internal untuk mewakili titik kode U + 00E1 dalam memori, dan itu tidak penting bagi kami):
>>> ua = u'á'
Saat Anda melihat nilai ua
, Python memberi tahu Anda bahwa itu berisi titik kode U + 00E1:
>>> ua
u'\xe1'
Contoh 3
Kode berikut menyandikan titik kode Unicode U + 00E1 (mewakili karakter á) dengan UTF-8, yang menghasilkan pola bit 11000011 10100001. Sekali lagi, untuk keluaran, pola bit ini direpresentasikan sebagai nomor hex 0xC3 0xA1:
>>> ua.encode('utf-8')
'\xc3\xa1'
Contoh 4
Berikut ini menyandikan titik kode Unicode U + 00E1 (mewakili karakter á) dengan Latin-1, yang menghasilkan pola bit 11100001. Untuk keluaran, pola bit ini direpresentasikan sebagai angka hex 0xE1, yang kebetulan sama dengan awal titik kode U + 00E1:
>>> ua.encode('latin1')
'\xe1'
Tidak ada hubungan antara objek Unicode ua
dan pengkodean Latin-1. Titik kode á adalah U + 00E1 dan pengkodean Latin-1 dari á adalah 0xE1 (jika Anda menafsirkan pola bit pengkodean sebagai bilangan biner) adalah murni kebetulan.
unicode
, ini hanya abstraksi dari karakter unicode;unicode
dapat diubah menjadistr
dengan beberapa pengkodean (misalnyautf-8
).