UTF-8

UTF-8 8-bitlik bir Unicode dönüşüm biçimidir (İng: Unicode Transformation Format 'ın kısaltması). Unicode karakterlerini değişken sayıda 8 bitten oluşan bayt (kod birimi) gruplarıyla kodlamakta kullanılır. Rob Pike ve Ken Thompson tarafından geliştirilmiştir.

UTF-8 kodlaması Unicode karakterlerini 1-6 bayt uzunluğunda diziler olarak kodlar. ASCII kodlaması içinde 0-127 arasında kalan karakterler, Unicode standardında aynı kod noktalarıyla ifade edildiğinden aynen kendi kodları ile kullanılır, diğerleri ise bayt dizileri haline gelir.

Karakterlerin her birinin kendilerine Unicode tarafından atanan bir kod noktası vardır. Her kod noktası 0 ile 1.114.111 arasında bir sayıdır. Bu kod noktaları iki tabanına dönüştürülürken doğrudan taban dönüşümü yapılmak yerine çeşitli yöntemler kullanılmaktadır. Bu yöntemlerin her biri ayrı birer karakter kodlama biçimi olarak adlandırılır. UTF-8 kodlama biçimi kod noktalarını değişken sayıda kod birimlerinden oluşacak şekilde iki tabanına dönüştürmeye olanak vermektedir. Kod birimlerinin her biri 8 bit uzunluğundadır. Dolayısıyla UTF-8 ile kodlanan bir metinde her karakterin uzunluğu 8'in katıdır. Kodlama yapılırken kodlanmış metni işleyecek bir bilgisayar yazılımının karakterlerin başlangıç ve bitiş noktalarını bilebilmesine olanak sağlamak için kod birimlerinin içine işaretçi bazı bitlerin yerleştirilmesi gerekmektedir.

Her karakterin birinci kod biriminin başında o karakteri kodlayan toplam kod birimi sayısı kadar hane 1 ve bu hanelerden sonraki ilk hane 0'dır.

UTF-8'in tasarımı ilk olarak Dave Prosser'ın önerdiği ve daha sonra Ken Thompson'ın üzerinde değişiklikler yaptığı aşağıdaki tabloda görülebilir. Bu tablodaki kalıplar kullanılarak kod noktasının bit sayısına uygun olan kalıp seçilip x ile işaretli kısımlara sağa dayalı olacak şekilde bitler yerleştirilmek ve geriye kalan kısımlar 0 ile doldurulmak suretiyle karakter kodlanmış olur.

Orijinal şartname 31 bite kadar olan tüm sayıları kapsamaktadır. Teorik olarak 31 bite kadar uzunluktaki sayıları UTF-8 ile kodlamak mümkün olsa bile, Kasım 2003'te çıkan RFC 3629 standardı ile UTF-8'in üst sınırı U+10FFFF olarak belirlenmiştir. Bunun nedeni diğer bir karakter kodlama biçimi olan UTF-16'nın kodlayabileceği en büyük kod noktasının U+10FFFF olmasıdır. Kodlama standartları arasında uyumluluk sağlanması ve hepsinin uzak gelecekte de sorunsuz olarak kullanılmaya devam edebilmesi için UTF-8'in üst sınırı da uygulamada U+10FFFF olarak belirlenmiştir. Ayrıca Unicode ve ISO 10646 yine UTF-16 ile uyumu korumak için karakterlere U+10FFFF'den daha büyük kod noktası atamamaya karar vermişlerdir. Bu yüzden yukarıdaki tabloda 5 ve 6 bayttan oluşan kalıpların tamamı ve 4 bayttan oluşan kalıpların da yarıya yakını günümüzde geçersizdir.

Geriye doğru uyumluluk: 0 ile 127 arasındaki ASCII değerleri için tek baytlık değerler kullanılmakta ve bu değerler başka karakterlerin kodlanması esnasında ortaya çıkmamaktadır. En yüksek basamaklı bit (8. bit) de bu karakterler için 0dır. Dolayısıyla 7-bitlik ve 8-bitlik ASCII ile kodlanmış metinler UTF-8 ayrıştırıcıları tarafından sorunsuzca işlenebilir.

Çok baytlı ve tek baytlı karakterler arasındaki açık ayrım: 127'den daha büyük kod noktaları çok baytlı dizilerle gösterilir ve bu dizilerde bir adet başlatıcı bayt ve bir veya daha fazla devam baytı bulunmaktadır. Başlatıcı bayt, dizideki toplam bayt sayısı kadar 1 ve daha sonra bir adet 0 ile başlar. Devam baytlarının ise tamamı 10 ile başlamaktadır. Eğer kod noktası tek baytla kodlanıyorsa bu bayt da doğrudan 0 ile başlamaktadır.

Kendini eş zamanlama: Başlatıcı bayt, devam baytı ve tek baytın değerleri birbiriyle asla aynı olamaz. Çünkü hepsi yukarıdaki tabloda görüldüğü gibi farklı şekillerde başlamaktadır. Bu özellik UTF-8'in kendini eş zamanlayabilen bir sistem olmasını sağlar. Yani UTF-8 ile kodlanmış metinleri işleyen bir yazılım, metin içinde rastgele seçtiği bir baytın karakter başlatan bayt olup olmadığını belirleyebilir ve karakterlerin başlangıç ve bitişlerini kolayca bulabilir. 0xxxxxxx, 110xxxxx, 1110xxxx ve 11110xxx bit kalıpları karakter başlangıcını ve bir sonraki geçerli karakterin başlangıcının kaç bayt sonra olduğunu açıkça işaret etmektedir.

Kodlanmış bayt dizilerinin uzunluklarının açıkça belirtiliyor olması: Başlatıcı baytın başındaki 1lerin sayısı devam eden baytların sayısını açıkça belli etmektedir. Dolayısıyla karakterin toplamda kaç bayt tarafından kodlandığı ve diğer karakterin nerede başladığı devam baytlarını tek tek incelemeden anlaşılabilmektedir. Dolayısıyla metinde karakter arama ve bulma işlemleri kolaylaşmış olur.

Değişken kod uzunluğu: Kodlanmış karakterlerin kapladığı yeri mümkün olduğunca azaltabilmek için değişken uzunluklu baytlarla kodlama yapılması büyük kolaylıklar sağlamaktadır. Örneğin sabit uzunluklu UTF-16 kodlamasında kodlanmış karakter uzunluğu iki bayttır. U+0000 ve U+00FF aralığındaki kod noktaları tek bayta sığabilmelerine karşın başlarına bir adet boş bayt konularak ikiye tamamlanırlar. Bu yüzden de sırf temel Latin harfleriyle yazılmış bir metin UTF-16 kodlamasıyla UTF-8'e göre iki katı yer kaplamaktadır. Değişken uzunluklu kodlama ile bu sorun çözülmüş ve her kod noktası ihtiyaç duyulduğu kadar baytla kodlanabilir hale gelmiştir.

İlk 128 karakter (US-ASCII kümesindeki karakterlerin aynısı) tek baytla kodlanır. Sonraki 1.920 karakter ise iki baytla kodlanır. Bu 1.920 karakter neredeyse tüm Latin alfabeleri ve ayrıca Yunan, Kiril, Koptik, Ermeni, İbrani, Arap, Süryani ve Thaana alfabelerini ve eklemlenebilen diyakritik işaretleri kapsamaktadır. Yaygın kullanımdaki hemen hemen tüm karakterleri bulunduran Temel Çokdilli Düzlemin bir ve iki baytla kodlananlar dışındaki tüm karakteri için üç bayt gerekir. Çin Japon ve Kore karakterlerinden pek yaygın kullanılmayanlar, çeşitli tarihi yazı biçimleri, matematiksel simgeler ve emojinin bulunduğu diğer Unicode düzlemlerindeki karakterler de dört bayt ile kodlanır.

On altı tabanındaki015F sayısı iki tabanında 001 0101 1111 şeklinde gösterilmektedir. Soldaki iki adet sıfır tablodaki kalıpta 11 bitlik boş yerin tamamını kaplamak için eklenmiştir.

Kodlama tamamlanmıştır. U+015F kod noktalı "ş" karakteri UTF-8 kodlamasında 110 10 şeklinde kodlanmaktadır. İki tabanındaki bu uzun bit dizilimi yazımı daha kolay olsun diye sıklıkla on altı tabanına dönüştürülerek olarak gösterilir.