UTF-8 (Unicode Translate Format-8)

12 Eylül 2011 Pazartesi 06:56 Gönderen Merve Yüzbaşıoğlu
UTF-8 nedir sorusuna cevap vermeden önce Unix tarzı sistemlerde UTF8 kullanılmasının sebebinden başlamak istiyorum. UCS(Universal Character Set) ve Unicode, karakterlere karşılık integer sayıların atandığı kod tablolarının ilkiydi. Karakter dizilerinin ve bunların integer değerlerinin, byte'larla temsil edilmesiyle ilgili birçok alternatif var ve unicode metinlerin 2 yada 4 bytelık depolanması en bilinen kodlamalardan(UCS-2 ve UCS-4). Unix altında UCS-2 (yada UCS-4) kullanımı ciddi sorunlara yol açıyor. Unix araçların çoğu ASCII dosyalarını bekler ve önemli değişiklikler yapılmaksızın karakter olarak 16 bit kelimeleri okuyamaz. Bu gibi nedenlerden dolayı UCS-2 dosya isimleri, metin dosyaları, çevre değişkenleri vb.. yerlerde uygun bir kodlama değildir.

ISO 10646-1:2000 'de tanımlanan UTF-8 kodlamasında bu problemler yoktur. Açıkcası Unix tarzı işletim sistemleri altında Unicode kullanılmasını sağlamak için kullanılmıştır.
UTF-8'in Özellikleri

  • U+0000 dan U+007F (ASCII) USC karakterleri basi olarak 0x00 dan 0x7F olarak kodlanır. Bunun anlamı ise, 7 bit ASCII karakterleri içeren string ve dosyalar ASCII ve UTF-8'in her ikisinde de aynı kodlamaya sahiptir.
  • Bigendian UCS-4 byte stringlerinin sıralaması korunur.
  • 0xFE ve 0xFF byteları UTF-8 kodlamasında asla kullanılmaz.
  • ASCII olmayan bir karakteri temsil eden çokbyte'lı bir serinin ilk byte'ı daima 0xC0-0xFD aralığındadır ve bu karakter için takip eden kaç byte'ın olduğunu gösterir. Çokbyte'lı bir serideki tüm ilave bytelar ise 0x80-0xBF aralığındadır. Bu senkronizasyon kolaylığı sağlar ve eksik byte olmasına karşın sağlam ve durum bilgisiz kodlama sağlar.
  • UTF-8 ile kodlanmış karakterler teorik olarak 6 byte uzunluğunda olabilir, ancak 16-bit BMP karakterleri sadece 3 byte uzunluğundadır.
Aşağıdaki byte dizisi bir karakteri temsil etmek için kullanılır. Kullanılan dizi, karakterin Unicode sayıına göre değişir.

U-00000000 – U-0000007F:0xxxxxxx
U-00000080 – U-000007FF:110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


xxx ile yazılan kısımlar, karakter kod sayılarının ikili gösterimindeki bitlerle doldurulur. En sağdaki x bit, en az anlamlı bittir.

Örnek: Unicode karakteri U+00A9 = 1010 1001 bunu UTF-8 'e kodladığımızda;

11000010 10101001=0xC2 0xA9 olarak kodlanıyor.

Python programlama dilinde "şarkıcı" kelimesini utf-8 formatına dönüştürmek için;

>>> s="şarkıcı"
>>> u=unicode(s,"utf-8")
>>> utf8=u.encode("utf-8")
>>> utf8
'\xc5\x9fark\xc4\xb1c\xc4\xb1'

örneğin burada "ş" karakterinin utf-8 kodlaması: \xc5 \x9f şeklinde gösteriliyor.
Buradaki "şarkıcı" kelimesinin uzunluğuna baktığımızda ise

>>> s.__len__()
10

yanıtını alırız. Buradanda anlayacağımız gibi ş, ı karakterleri unicode da 2 bytelık karakter seti olarak ifade ediliyor ve ilk baktığımızda uzunluğunun 7 olduğunu düşündüğümüz kelimenin uzunluğu 10 oluyor.

Sonuç olarak UTF-8 Unicode karakterlerini 1-6 byte uzunluğunda diziler olarak kodluyor. ASCII'deki 0-127 arasındaki karakterler UTF-8 de kendi kodları ile kullanılıyor, diğerleri ise byte dizileri haline gelir. UTF kullanılarak 1 milyondan fazla karakter kodlanabiliyormuş:)

KAYNAK:



1 Response to "UTF-8 (Unicode Translate Format-8)"

  1. Merve Yüzbaşıoğlu Says:

    Hatalı olduğum ve yanlış anladığım kısımlar olabilir:)

Yorum Gönder