Bu ilginç bir konu. Bilgisayarınızda bir metin düzenleyici açıp sadece "a" (tırnaklar olmadan) yazıp kaydettiğinizde diske ne yazılır? Yazılan hiçbir zaman sadece "a" olmaz. Aslında arka planda "a" diye birşey de yoktur. Bu konu 1960'larda ASCII standardı ile bir düzene oturtulmuş. Bir metin dosyasına yazılabilecek her şey bir tabloda toplanmış [1]. Bu standardın ilk geliştirildiği dönemde bu tabloda hangi harf ve diğer karakterlerin olacağına dair bazı görüşmeler olmuş. Bu görüşmelere Türkiye'nin de davet edildiği, ancak o dönemde Türkiye'nin başka işleri olduğuna dair bir şey duymuştum ama doğrulayamadım. Sonuçta bu tabloda ç ve ü gibi (Türkçe hariç diğer dillerde de var olan) harfler var, ama ı ve ğ gibi (sadece Türk alfabesine özgü) harfler yok. Türkiye 1980'lerin sonunda oyuna dahil olmuş ve ISO 8859-9 standardında Türkçe harflerin tümünün yer aldığı bir kodlama oluşturulmuş (bir de Windows 1254 mü var?).
Benzer şekilde çok sayıda karakter tablosu oluşmuş. Bir dosyanın düzgün görüntülenmesi için ilgili dosyanın belli bir karakter kodlaması / tablosu ile açılması gerek. Yani diskte 221 yazıyorsa her tabloda bu aynı harfe karşılık gelmeyebilir.
Bunların hepsi 1 karakterin 8 bitlik (1 byte) kodlama ile ifade edildiği dönemdi. Yani 2 üzeri 8 = 256 yapacağından, her tablo en fazla 256 karakter içeriyor ki buna bazı kontrol karakterleri, sayılar, küçük ve büyük harfler ile bazı özel sembollar (parantez, artı ve eksi işareti gibi) ve noktalama işaretleri de konduğunda aslında sadece 1 alfabe içerebilen bir tablodan bahsediyorum. Aynı anda sadece 1 karakter tablomuz olacağından iki farklı dilde harfin olduğu bir metin dosyasının var olması mümkün değildi.
Daha sonraları 1 byte (8 bitlik) kodlamanın yerine çok byte'lı kodlamanın kullanılması ve aslında dünya üzerindeki bütün alfabelerin sığdırılabileceği hatta bazı özel karakterlere bile yer kalacak bir tablonun yürürlüğe girmesi söz konusu olmuş. Bu durumda her harf iki veya daha fazla byte ile ifade edilir olmuş. İşler giderek karmaşıklaşıyor.
Standartların oluşması bana hep bu karikatürü çağrıştırıyor.
Sonunda açmak üzere olduğumuz dosyanın tek byte mı çift byte mı kodlama ile oluşturulduğunu önceden bilmemiz, hatta tek byte ise hangi karakter tablosu ile oluşturulduğunu bilmemiz/tahmin etmemiz/deneye yanıla bulmamız gerekiyor. Hala bazı metin dosyalarını açarken karakter kodlamasını söylememizi istemesi veya bazı (yüksek ihtimalle Türkçe) karakterlerin bozuk görüntülenmesi bundan kaynaklı.
Dosyada bazı karakterler (veya tümü) birden fazla byte kullanılarak ifade ediliyorsa bunu dosyanın başına bir imza koyarak işaretlemek istemişler. Bunun için Byte Order Mark (BOM) denen bir imza oluşturulmuş. Bir de bilgisayar dünyasında çok byte'lı verileri yazarken önce büyük basamakların mı yoksa küçük basamakların mı yazılacağı konusu var.
Dosyanın başındaki ilk 4 byte'ın aşağıdaki değerlerine göre dosya tipleri şöyle:
byte 1 | byte 2 | byte 3 | byte 4 | Anlamı |
0x2b | 0x2f | 0x76 | - | UTF7 |
0xff | 0xfe | - | - | Unicode - little endian |
0xfe | 0xff | - | - | Unicode - big endian |
0x00 | 0x00 | 0xfe | 0xff | UTF32 |
0xef | 0xbb | 0xbf | - | UTF8 |
- | - | - | - | ASCII |
Herhangi bir byte için "-" olması o byte'ın öneminin olmadığı anlamına geliyor. Koşulların hiçbirisi sağlanmıyorsa (en alttaki satır) dosyanın ASCII olduğu varsayılıyor.
UTF8 kodlaması için şu tablo, genişçe bir Unicode tablosu için şu tablo, her türlü kodlamayı tek sayfada görmek için de şu sayfa kullanılabilir.
Örnek birkaç karakter için kodlamalar
Karakter | ISO 8859-9 | UTF8 | U+ |
a | 91 (0x61) | 0x61 | U+0061 |
ç | 231 (0xE7) | C3 A7 | U+00E7 |
ğ | 240 (0xF0) | C4 9F | U+011F |
---
[1] https://en.wikipedia.org/wiki/ASCII
[2] https://lokalise.com/blog/what-is-character-encoding-exploring-unicode-utf-8-ascii-and-more/