Karakter Kodlama Nedir? ASCII, Unicode ve UTF-8
Karakter kodlama, harf, rakam ve sembolleri bilgisayarların saklayıp aktarabileceği sayısal gösterimlere dönüştüren kurallardır. ASCII 128 karakterle sınırlıyken Unicode çok daha geniş karakter kümesini tanımlar; UTF-8 ise bu Unicode karakterlerini 1 ila 4 byte arasında kodlar.
Bu yazıda (6)
Karakter Kodlama Nedir? ASCII, Unicode ve UTF-8
Bilgisayar bir metni insan gözüyle görmez; harfleri, noktalama işaretlerini ve emojileri sayısal değerlerle işler. Ancak yalnızca bir karaktere sayı vermek yeterli değildir. Bu sayının dosyada hangi bit ve byte dizisiyle saklanacağı, karşı tarafta hangi kuralla okunacağı ve ekranda hangi yazı tipiyle gösterileceği de belirlenmelidir.
Karakter kodlama konusu bu nedenle üç farklı katmanı birbirinden ayırmayı gerektirir: karakterin ne olduğu, bu karaktere verilen sayısal kod ve sayının fiziksel olarak byte'lara dönüştürülmesi. ASCII, Unicode ve UTF-8 arasındaki farklar özellikle Türkçe karakterlerde, farklı dillerdeki metinlerde ve web sayfalarında belirginleşir. Aşağıdaki rehberde önce bu katmanları ayıracak, ardından somut sayılarla kodlama ve bozuk metin sorununu inceleyeceğiz.
Bir harfin sayıya dönüşmesinde üç ayrı katman
Karakter kodlamayı anlamak için karakter kümesi, kod noktası ve kodlama biçimi kavramlarını ayırmak gerekir.
Karakter, insanın anlam verdiği birimdir: büyük 'A', küçük 'a', '0', soru işareti veya bir emoji gibi. Karakter kümesi ya da standardı, hangi karakterlerin tanımlandığını ve bunların hangi sayısal değerlere karşılık geldiğini belirler. Bu sayısal değere kod noktası denir. Örneğin ASCII'de büyük 'A' karakterinin değeri 65, küçük 'a' karakterinin değeri 97 ve '0' rakamının değeri 48'dir.
Kod noktası ile dosyada tutulan byte aynı şey değildir. Kod noktası, karakterin standart içindeki kimliğidir; kodlama biçimi ise bu kimliği bilgisayarın depolayacağı veya ileteceği bit ve byte dizisine dönüştürür. Unicode karakterleri tanımlar, UTF-8 ise bu karakterlerin fiziksel olarak kodlanma yöntemlerinden biridir.
Bu ayrımın pratik sonucu şudur: Bir metnin ekranda bozuk görünmesi, karakterin standartta bulunmadığı anlamına gelmeyebilir. Karakter tanımlı olduğu hâlde dosya bir kodlama biçimiyle yazılıp başka bir biçimle okunuyor olabilir. Ayrıca kodlama doğru olsa bile uygun font yoksa karakter yerine boş kutu görülebilir. Font karakterin şeklini gösterir; karakter kodlaması ise hangi karakter olduğuna ilişkin sayısal eşleştirmeyi belirler.
ASCII neden 128 karakterle sınırlıdır?
ASCII, American Standard Code for Information Interchange ifadesinin kısaltmasıdır ve 1960'lı yılların başında geliştirilen temel bir standarttır. ASCII 7 bit kullanır. 7 bit ile oluşturulabilecek farklı değer sayısı olduğundan ASCII kodları 0 ile 127 arasındadır.
Bu aralıkta İngilizce büyük ve küçük harfler, 0-9 arasındaki rakamlar, noktalama işaretleri ve bazı kontrol karakterleri bulunur. Örnek olarak 'A' 65, 'a' 97, '0' ise 48 değerine sahiptir. Bu sayılar karakterin kendisi değildir; ASCII tablosunda o karaktere karşılık gelen sayılardır.
ASCII'nin güçlü yönü, küçük ve basit bir ortak dil oluşturmasıdır. İngilizce ağırlıklı metinlerde temel harf ve işaretlerin sistemler arasında tutarlı biçimde aktarılmasına yardımcı olur. Sınırı ise 128 karakterlik kapasitesidir. Türkçedeki ç, ğ, ı, İ, ö, ş, ü gibi karakterler veya Latin alfabesi dışındaki yazı sistemleri bu temel aralığa sığmaz. Bu nedenle yalnızca ASCII bekleyen bir sistemde Unicode karakterleri kullanıldığında karakter kaybı, soru işareti veya anlamsız semboller görülebilir.
Burada önemli bir sınır vardır: ASCII ile uyumlu olmak, bir kodlamanın yalnızca ASCII bölümünde aynı değerleri kullanması demektir. Bu ifade, kodlamanın tüm dilleri desteklediği anlamına gelmez.
Unicode karakteri tanımlar, UTF biçimi onu depolar
Unicode, farklı dillerin alfabelerini, çeşitli sembolleri ve emojileri tek bir evrensel standart içinde tanımlamak amacıyla geliştirilmiştir. ASCII'deki 0-127 aralığıyla sınırlı değildir; çok daha geniş bir karakter alanı için benzersiz kod noktaları sağlar.
Unicode ile UTF-8, UTF-16 ve UTF-32 aynı kavram değildir. Unicode, 'hangi karakterin hangi kod noktasına sahip olduğunu' tanımlayan standarttır. UTF biçimleri ise bu kod noktalarının bellekte, dosyada veya iletişim sırasında nasıl byte dizilerine dönüştürüleceğini belirler. Dolayısıyla 'Unicode kullandım' demek, tek başına metnin kaç byte tuttuğunu söylemez; kullanılan UTF biçiminin de bilinmesi gerekir.
UTF-8'in önemli özelliği, ASCII ile uyumlu olmasıdır. ASCII'deki ilk 128 karakter, UTF-8 içinde de aynı temel gösterim mantığıyla korunur. Bunun yanında UTF-8, her geçerli Unicode kod noktasını 1 ila 4 byte ile kodlar. Kullanıcı tarafından tek karakter gibi görülen birleşik emoji veya sembol dizileri ise birden fazla kod noktası içerdiğinden toplamda 4 byte'tan fazla yer kaplayabilir. Bu nedenle yalnızca ASCII karakterlerinden oluşan bir metin ile Türkçe karakterler, farklı alfabeler veya emojiler içeren metnin byte cinsinden boyutu aynı olmayabilir.
Bu noktada 'bir karakter = bir byte' kuralı yalnızca uygun koşulda geçerlidir. ASCII karakterleri için ve UTF-8'in ilgili temel aralığında bu yaklaşım işe yarar; ancak tüm Unicode karakterleri için kullanılamaz. Metin uzunluğunu hesaplarken karakter sayısı ile byte sayısını birbirine karıştırmamak gerekir.
UTF-8 okunurken neden karakterler bozulur?
Bir metin dosyası oluşturulurken karakterler seçilen kodlama biçimine göre byte'lara dönüştürülür. Dosya açılırken kullanılan okuma kuralı, yazma sırasında kullanılan kuralla uyuşursa bilgisayar bu byte'ları doğru karakterlere çevirebilir. Uyuşmazlıkta ise aynı byte dizisi farklı bir karakter tablosuna göre yorumlanabilir.
Örneğin Türkçe bir metin UTF-8 olarak kaydedilmiş, fakat alıcı program onu başka bir kodlama bekliyormuş gibi açmışsa 'ç', 'ğ' veya 'ş' gibi karakterler bozuk görünebilir. Bu durum genellikle mojibake olarak adlandırılır. Sorun çoğu zaman metnin anlamının değişmesinden değil, byte'ların yanlış çözülmesinden kaynaklanır.
Tanı koyarken şu sırayı izlemek yararlıdır:
- Dosyanın veya iletişimin hangi kodlama ile oluşturulduğunu belirleyin.
- Okuyan uygulamanın aynı kodlamayı kullandığını kontrol edin.
- Metinde yalnızca ASCII karakterleri mi, yoksa Türkçe karakterler ve semboller de mi bulunduğuna bakın.
- Kodlama doğru olduğu hâlde kutu veya eksik glif görünüyorsa font desteğini inceleyin.
- Metin bir veritabanı, web sayfası veya dosya arasında taşınıyorsa her aşamada kodlamanın değişip değişmediğini kontrol edin.
Kodlama hatası ile font eksikliği aynı belirtiyi verebilir; fakat nedenleri farklıdır. Kodlama, byte'ların hangi karaktere çevrileceğini; font, doğru karakterin hangi görsel biçimde çizileceğini belirler.
Çözümlü örnekler: ASCII değerinden UTF-8 metnine
Örnek 1 — 'M' karakterinin ASCII ve ikili gösterimi
Verilenler: Karakter 'M'; ASCII değeri 77.
- ASCII standardında 'M' için verilen sayısal değer 77'dir.
- ASCII 7 bit kullandığı için bu değer 0-127 aralığına girer.
- ASCII değeri 77'nin 7 bitlik gösterimi 1001101'dir. Bir byte içinde gösterildiğinde ise 01001101 biçimi kullanılabilir.
- Program bu değeri karakter tablosuna göre yorumladığında ekranda 'M' görüntülenir.
Sonuç: 'M' karakteri için karakterin kendisi, ASCII kod noktası olan 77 ve bit gösterimi olan 1001101 birbirinden farklı ama birbirine bağlı üç gösterimdir. Bir byte içindeki gösterim ise başına sıfır eklenerek 01001101 biçiminde yazılabilir. 77 sayısını doğrudan 'M' harfinin görseli sanmak doğru değildir; doğru sonuç, ASCII tablosuna başvurulduğunda elde edilir.
Örnek 2 — 'Merhaba' metninde karakter ve byte sayısını ayırma
Verilenler: Metin 'Merhaba'; metindeki tüm karakterler ASCII aralığındadır; kodlama UTF-8'dir.
- Metindeki karakterleri sayın: M, e, r, h, a, b, a olmak üzere 7 karakter vardır.
- UTF-8, ASCII ile uyumlu olduğu için bu karakterlerin her biri temel ASCII aralığında kodlanır.
- Bu özel durumda her karakter 1 byte ile temsil edilir.
- Toplam depolama miktarı byte olur.
Sonuç: Bu örnekte karakter sayısı ile byte sayısı eşittir. Ancak bu sonuç, metindeki bütün karakterlerin ASCII aralığında olması ve UTF-8 kullanılması koşuluna bağlıdır. Aynı hesap Türkçe karakterler, farklı alfabeler veya emojiler için doğrudan uygulanamaz; UTF-8'de bu karakterler 1 ila 4 byte kullanabilir.
Sık yapılan hatalar ve karıştırılan kavramlar
ASCII ile Unicode'u aynı kapsamda sanmak: ASCII 128 karakterlik, 7 bitlik daha sınırlı bir standarttır. Unicode ise çok daha geniş karakter kümesini tanımlar. ASCII, Unicode'un tamamı değildir; UTF-8'in ASCII ile uyumlu temel bölümüyle karıştırılmamalıdır.
Unicode ile UTF-8'i eş anlamlı kullanmak: Unicode karakterlerin kimliğini tanımlar, UTF-8 ise bu kimlikleri byte dizilerine dönüştürür. 'Unicode dosyası' ifadesi tek başına yeterli açıklama değildir; UTF-8, UTF-16 veya UTF-32 gibi biçimin belirtilmesi gerekir.
Her karakterin 1 byte olduğunu düşünmek: Bu yaklaşım, yalnızca ASCII aralığındaki karakterler için ve uygun kodlama koşulunda geçerlidir. UTF-8'de her Unicode kod noktası 1 ila 4 byte ile kodlanır; birden fazla kod noktasından oluşan kullanıcı tarafından tek karakter gibi görülen diziler daha fazla byte kullanabilir.
Rakam karakteri ile sayıyı karıştırmak: ASCII'de '0' karakterinin kodu 48'dir. Bu, matematiksel olarak sıfır değerinin bilgisayar belleğinde her durumda 48 olduğu anlamına gelmez. Burada söz konusu olan, '0' yazı karakterinin ASCII tablosundaki karşılığıdır.
Fontu kodlama sanmak: Kodlama doğru karakteri seçer; font bu karakteri görsel olarak çizer. Uygun font yoksa kutu veya eksik sembol görülebilir. Yanlış kodlama varsa byte'lar yanlış karakterlere dönüştürülebilir.
Kodlama hatasını veri sıkıştırmayla karıştırmak: Kodlama, metnin temsil edilmesini sağlar. Sıkıştırma ise verinin daha az yer kaplaması amacıyla gösterimini dönüştürür. UTF-8 kullanmak tek başına veri sıkıştırma işlemi değildir.
Her bozuk karakterin aynı nedenden çıktığını düşünmek: Yanlış okuma kodlaması, eksik font, veri aktarımı sırasında kayıp veya uygulamalar arası uyumsuzluk benzer belirtiler oluşturabilir. Sorunun kaynağını belirlemeden yalnızca font değiştirmek ya da dosyayı yeniden kaydetmek kalıcı çözüm olmayabilir.
ASCII kapasitesi: karakter. ASCII kod aralığı: -. UTF-8'de bir karakterin kapladığı alan, karaktere bağlı olarak - byte olabilir. ASCII aralığındaki 7 karakterlik 'Merhaba' için, UTF-8 koşulunda toplam alan byte'tır.
Bir arkadaşınız size içinde 'Ş' harfi bulunan Türkçe bir CSV dosyası gönderiyor. Dosya UTF-8 olarak kaydedildiği hâlde tablo programı farklı bir kodlamayla açarsa 'Ş' bozuk bir sembole dönüşebilir. Dosyayı UTF-8 seçeneğiyle yeniden açmak, byte'ların yazılırken kullanılan kurala göre çözülmesini sağlar; sorun fonttan kaynaklanıyorsa ayrıca uygun yazı tipinin bulunması gerekir.
TYT ve AYT bilişim temalı sorularda önce kavram katmanını ayırın: ASCII bir karakter kodlama standardı, Unicode geniş bir karakter standardı, UTF-8 ise Unicode karakterlerini byte'lara dönüştüren biçimdir. Sayısal soruda 7 bit için değer ve 0-127 aralığı birlikte düşünülür. 'Her karakter 1 byte'tır' ifadesini ancak karakterlerin ASCII aralığında olduğu ve UTF-8 kullanıldığı belirtilmişse kabul edin. '0' karakterinin ASCII değerinin 48 olması ile sayısal sıfırın değeri aynı kavram değildir.
Sık sorulan sorular
Karakter kodlama ile font arasındaki fark nedir?
Karakter kodlama, bir karakterin hangi sayısal değerle temsil edilip byte'lara dönüştürüleceğini belirler. Font ise doğru karakterin ekranda hangi görsel biçimde görüneceğini belirler. Kodlama doğru olduğu hâlde uygun font yoksa boş kutu görülebilir; font uygun olduğu hâlde kodlama yanlışsa metin bozulabilir.
ASCII neden Türkçe karakterleri tek başına karşılayamaz?
ASCII 7 bit kullanır ve yalnızca 0-127 arasındaki 128 karakteri kapsar. Bu sınırlı kümede Türkçedeki ç, ğ, ı, İ, ö, ş ve ü gibi karakterlerin tamamı bulunmaz. Bu nedenle Türkçe metinler için daha geniş bir karakter standardına ve uygun kodlama biçimine ihtiyaç duyulur.
Unicode ile UTF-8 arasındaki ilişki nedir?
Unicode, karakterlere benzersiz kod noktaları veren geniş standarttır. UTF-8 ise bu kod noktalarını dosya ve iletişim ortamında kullanılacak byte dizilerine çeviren Unicode dönüşüm biçimlerinden biridir. UTF-8, ASCII ile uyumludur ve her geçerli Unicode kod noktasını 1 ila 4 byte ile kodlar. Birleşik emoji veya sembol dizileri birden fazla kod noktası içerdiği için toplam uzunlukları 4 byte'tan fazla olabilir.
Bir dosyanın karakterleri neden anlamsız sembollere dönüşür?
Dosya yazılırken kullanılan kodlama ile dosyayı okuyan uygulamanın varsaydığı kodlama uyuşmayabilir. Bu durumda aynı byte dizisi yanlış kuralla çözülür ve mojibake adı verilen bozuk metin oluşabilir. Sorun font eksikliğinden de kaynaklanabileceği için önce kodlama, sonra font kontrol edilmelidir.
UTF-8'de her karakter kaç byte yer kaplar?
UTF-8'de her Unicode kod noktası 1 ila 4 byte kullanır. Birleşik emoji veya sembol dizileri birden fazla kod noktası içerdiği için toplam uzunlukları 4 byte'tan fazla olabilir. ASCII aralığındaki karakterler için 1 byte yaklaşımı geçerlidir; fakat tüm Unicode karakterleri için geçerli değildir. Bu yüzden karakter sayısı ile dosya boyutunu hesaplarken metnin içeriği ve kodlama biçimi birlikte değerlendirilmelidir.
- •Karakter Kodlama, ASCII, Unicode ve UTF-8medium.com
- •ASCII - Vikipedien.wikipedia.org
- •Karakter Kodlama | Ascii ve Unicode Nedir | Python Dersleriyoutube.com