UTF-8 Nedir ve Nasıl Çalışır?

Bu flood’da hepimizin duymuş olduğu fakat detaylarına azımızın hakim olduğu UTF-8 karakter kodlamasından (character encoding) bahsedeceğim. Ne garip bir tesadüftür ki (!) bu kodlama, Go dilini de geliştiren Rob Pike ve Ken Thompson tarafından tasarlanmıştır her ne kadar Rob Pike bütün krediyi Thompson’a verse de :-) UTF-8, geriye uyumluluk konusunda bilişim tarihinin gördüğü en akılcı yöntemlerden biri olabilir.

Pratikte birbirleri yerine kullanılabiliyor olsalar da karakter kodlamaları ile karakter setleri farklı şeylerdir. ASCII ve Unicode birer karakter setidir; UTF-8, UTF-16 ise birer karakter kodlamasıdır. Karakter setleri, karakterleri ve bunlara karşılık gelen karakter kodlarını (code point) tanımlarlar. ASCII’de karakterler 7 bit ile ifade edilirler, dolayısıyla 127 farklı karakter vardır. Unicode ise dünyadaki alfabelerde bulunan yüzbinden fazla karakteri barındırır. ASCII’nin boş bıraktığı 8. bit kullanılarak Extended ASCII adı altında, birçok Batı Avrupa karakterini kapsayan ISO-8859–1 ve Türkçe karakterleri kapsayan ISO-8859–9 karakter setleri geliştirilmiştir.

İnternetin ortaya çıkması ile birlikte ortak bir karakter seti üzerinden konuşma ihtiyacı doğar fakat 4 byte (32 bit) Unicode karakterleri 8 bite göre oldukça verimsiz görünür. Her bir karakterin diskte ve RAM’de 24 bit fazla yer kaplamasına, 8 bit karakter okumaya alışmış eski bilgisayarların bir günde cahil kalmasına kahramanlarımızın (Ken ve Rob) gönlü el vermez. Geriye dönük ASCII uyumlu olan ve israfa yol açmayan karakter kodlamasını geliştirmeye Çarşamba akşam yemeğinde başlarlar, Pazartesi’ye kadar da implementasyonu hazır hale getirirler.

Şimdi biraz da bu kodlamanın tam bir kıvrak zeka ürünü olan detaylarına ve geriye uyumluluk ve tasarrufu nasıl maksimize ettiğine bakalım.

UTF-8, ASCII’nin 7 bit ve başındaki bitin 0 olmasından faydalanır. Başındaki bit 0 olan karakterler ASCII karşılıkları ile eşleştirir.

Dolayısıyla tamamiyle ASCII karakterlerden oluşan bir metnin UTF-8 karşılığı metnin bire bir aynısıdır, ne bir bit eksik ne bir bit fazla.

UTF-8, bir bayt yani 8 bit ile ifade edilemeyecek Unicode karakterleri ise birden fazla bayt ile ifade eder. Birden fazla bayt ile kodlanacak karakterlerde eğer karakter kodlaması için iki bayt yeterli olacaksa ilk bayt, iki adet 1 ve bir 0 yani 110 ile; üç bayt yeterli olacaksa, üç adet 1 ve bir 0 yani 1110 ile; dört bayt gerekecekse de dört 1 ve bir 0 ile başlar. Yani ilk bayttaki 1 sayısı toplam bayt sayısını ifade eder. Spec yedi 1 ve bir 0'a dahi izin verse bile pratik olarak buna ihtiyaç duyulmaz.

Aşağıdaki gösterimde olduğu gibi birden fazla bayttan oluşan bütün karakterler için ilk bayttan sonraki baytlar 10 ile başlar.

İlk bayttan arda kalanlar ile sonraki baytlardan arda kalan bitler birleştirilerek oluşan sayı Unicode setinde bulunur ve dönüşüm yapılır.

Bu flood üzerine pratik olduğunuz programlama dilinde bit operasyonları ile Türkçe karakter içeren bir metni binary olarak decode edebilirsiniz. İnceleyeceğiniz dosya Windows’ta hazırlandıysa BOM (Byte Order Mark)’a dikkat ediniz.