Wednesday, 15 August 2007

Encoding - Evrensel Kod - Karakter Setleri (I)


Türkçe karakterlerden çok çeken bir developer milleti olarak encoding üzerine çok kafa yorduğumuz hepimizin malumu. Ben de bu konuda okuduklarımı ve kafamda kalanları özetleyeyim istedim ki, geri dönüp tekrar okuma ve hatırlama imkanım olsun :)


Karakterin tanımlanmasının tarihçesine baktığımızda ilk önce ASCII'yi görürüz. Hikayeye ASCII'den başlamakta yarar var o zaman.


1960 yılında ASCII üzerinde çalışılmaya başlanmış ve ilk kullanıma sunuluşu 1963'te olmuş. Zamanında, programlamada sadece ingiliz alfabesinin temel harfleri baz alındığında, ASCII (American Standard Code for Information Interchange) gerekli olan tüm karakterleri sağlıyormuş ve hatta o zamanlar için ekstra 1 bit de fazla kalıyormuş.


Bu alfabe içindeki tüm karakterleri kullanmak için 32 ve 127 arasındaki tüm rakamlar yeterli oluyordu. 32'den düşük rakamlar kontrol kodlarıydı. 2^7 karakter yeterliydi yani 7 bit tüm gerekli karakterleri kapsayacak büyüklükteydi. 8. bit ise parity bit olarak kullanılmaya başlandı.


IBM PC, bu 8. bit dolayısıyla oluşan karakterler boşluğunu yani 128-255 arasındaki rakamları OEM karakter seti olarak tanımlayarak bazı Avrupa Dillerine has harfleri ve bazı çizgisel karakterleri bu liste içine kattı. Birçok ülke de bu üst 128 karakteri (128 - 255 arası) kendi kullanımları için tanımladılar.

Bundan sonraki adım ANSI standartlarının getirilmesi oldu. 128 numarasının ve altının ne olacağı konusunda genel bir karar alındı ve 128'in üstü yaşanılan yere göre değişiklik gösterecek şekilde bırakıldı. Her ülke, DOS'ta kendisine uygun code page'leri düzenleyip kullanmaya başladı. Örneğin, 857 isimli code page Türkçe için tanımlanırken, 737 Yunanca için tanımlandı.

Bu arada, Asya dillerinin bazılarında binlerce karakter olduğundan ve 8-bit'lik yapı yetersiz kaldığından, DBCS(Double Byte Character Set) denen bir sistem kullanılmaya başlandı. Bu yapıda bazı karakterler 2 byte ile temsil edilirken bazıları tek byte ile temsil edilmekteydi. Bu da karışıklığa neden olmaktaydı.


Buradan bir sonraki adım da Unicode'dur. Unicode, kullanılabilecek her tür karakteri içinde barındıran tek bir karakter seti oluşturma çalışmalarının bir meyvesidir. Unicode'da her karaktere bir hexadecimal değer verilmiştir ve bu tanım numaranın başına U+ getirilerek yapılmıştır.


Yani örneğin Mahir'in unicode açılımı şöyle oluyor: 004D 0061 0068 0069 0072


1990'ların sonlarına doğru geliştirilmiş olan bu sistem sayesinde bir veri dosyası içine birden fazla yazı sistemiyle yazılabilme imkanı doğdu. Aynı zamanda, unicode'u tanıyan sistemler birçok dildeki veriyi okuyabilir ve işleyebilir hale geldi.

No comments: