- UTF-8, milyonlarca karakteri ifade ederken ASCII ile geriye dönük uyumluluğu koruyan değişken uzunluklu bir kodlama yöntemidir
- ASCII ile aynı 7 bitlik alan (
U+0000~U+007F) aynen 1 bayt olarak kullanılır; bu sayede ASCII dosyaları aynı zamanda geçerli UTF-8 dosyalarıdır
- Bunun dışındaki karakterler 2~4 baytlık dizilerle gösterilir; ilk baytın bit deseni uzunluğu belirler ve sonraki baytlar
10 ile başlayarak bunların devam baytı olduğunu ayırt eder
- Bu tasarım sayesinde UTF-8, evrensel karakter kümesini işlerken mevcut ASCII sistemleriyle de tam uyumluluk sağlar ve en yaygın kullanılan karakter kodlaması haline gelir
- UTF-16, UTF-32 gibi diğer Unicode kodlamaları bu tür bir ASCII uyumluluğu sunmaz
UTF-8 tasarımının üstünlüğü
- UTF-8 kodlamasıyla ilk karşılaştığımda, farklı dillerdeki ve yazı sistemlerindeki milyonlarca karakteri tek bir yapıda birleştirirken aynı zamanda mevcut ASCII ile uyumlu bir yapı sunması beni çok etkilemişti
- Temelde UTF-8 en fazla 32 biti kullanır, ancak ASCII yalnızca 7 bit kullanır
- UTF-8'in tasarım ilkeleri şöyledir
- Tüm ASCII kodlu dosyalar geçerli UTF-8 dosyalarıdır
- Yalnızca ASCII karakterleri içeren tüm UTF-8 dosyaları geçerli ASCII dosyalarıdır
- Sadece 128 karakterle sınırlı eski bir sistemi milyonlarca karakteri kapsayan bir yapıyla birleştirme fikri son derece yenilikçidir
UTF-8'in temel kavramı
- UTF-8, Unicode karakter kümesindeki tüm karakterleri göstermek amacıyla tasarlanmış değişken uzunluklu karakter kodlamasıdır (variable-width encoding)
- Her karakteri 1~4 bayt ile kodlar
- İlk 128 karakter (
U+0000~U+007F) tek bayt olarak saklanır; böylece ASCII ile geriye dönük uyumluluk sağlanır
- Diğer karakterler iki, üç veya dört baytla kodlanır
- İlk bayttaki öncü bitler, kodlama için gereken toplam bayt sayısını belirler
| 1 bayt deseni |
Bayt sayısı |
Tüm bayt dizisi deseni |
| 0xxxxxxx |
1 |
0xxxxxxx (tipik ASCII) |
| 110xxxxx |
2 |
110xxxxx 10xxxxxx |
| 1110xxxx |
3 |
1110xxxx 10xxxxxx 10xxxxxx |
| 11110xxx |
4 |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
- Çok baytlı dizilerde 2., 3. ve 4. bayt her zaman
10 ile başlar; bu da bunların devam baytı olduğunu açıkça gösterir
- Ana bayt ile devam baytlarındaki kalan bitler birleştirilerek tek bir kod noktası oluşturulur
- Kod noktası, benzersiz Unicode karakter tanımlayıcısıdır ve "U+" önekiyle birlikte onaltılık biçimde gösterilir
- Örnek: "A" karakterinin kod noktası
U+0041'dir
- UTF-8 kodlama baytlarından karakter çözümleme akışı şöyledir
- 1. Baytı oku; ilk bit 0 ise bunu tek baytlık karakter (ASCII) olarak kabul et, kalan 7 bit ile karakteri belirle ve sonraki bayta geç
- 2. Eğer 0 değilse
- 110 ise 2 baytlık karakterdir; sonraki 1 baytı daha oku
- 1110 ise 3 baytlık karakterdir; sonraki 2 baytı oku
- 11110 ise 4 baytlık karakterdir; ek olarak 3 bayt oku
- 3. Belirlenen baytlarda öncü bitler dışındaki kalan bitleri birleştir ve bunu kod noktasının ikili değeri olarak kullan
- 4. Unicode karakter kümesinde bu kod noktasını bul ve ekranda göster
- 5. Sonraki bayt için tekrarla
Örnek: Hintçe harf "अ"
- UTF-8 gösterimi:
11100000 10100100 10000101 (3 bayt)
- İlk bayt (
11100000) → bunun 3 baytlık bir karakter olduğunu gösterir
- Üç bayttaki anlamlı bitlerin birleşimi →
00001001 00000101 = onaltılık 0x0905
U+0905 kod noktası, Devanagari harfi "अ" anlamına gelir
Dosya örnekleri
-
1. Hey👋 Buddy
- Toplam 13 bayttan oluşur
- ASCII karakterleri (H, e, y, B, u, d, d, y, boşluk) → her biri 1 bayt
- 👋 (U+1F44B) → 4 bayt
11110000 10011111 10010001 10001011
- Bu dosya geçerli bir UTF-8 dosyasıdır, ancak ASCII dışı karakter (emoji) içerdiği için ASCII ile geriye dönük uyumlu değildir
-
2. Hey Buddy
- Toplam 9 bayt, hepsi ASCII aralığındadır
- Bu nedenle bu dosya aynı anda hem geçerli bir ASCII dosyası hem de geçerli bir UTF-8 dosyasıdır
Diğer kodlamalarla karşılaştırma
- ASCII ile uyumluluk sunan başka bazı kodlamalar da vardır, ancak UTF-8 kadar yaygın kullanılmazlar
- GB18030 (Çin standardı) gibi kodlamalar da ASCII uyumluluğu sunar, ancak yaygın değildir
- ISO/IEC 8859 ailesi, tek baytlık genişletme (en fazla 256 karakter) olduğu için sınırlıdır
- UTF-16/UTF-32 ASCII uyumluluğuna sahip değildir
- 'A' (U+0041): UTF-16
00 41, UTF-32 00 00 00 41
Bonus: UTF-8 Playground
Henüz yorum yok.