34 puan yazan GN⁺ 2025-09-13 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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.

Henüz yorum yok.