Karakter kodlaması nedir
Kodlama bir anlaşmadır: “65 sayısı A harfi demektir”. Bir metin yazdığında program bu sayıları saklar; başka biri açtığında onun programı aynı anlaşmayı kullanarak sayıları tekrar harflere çevirir. İkisi aynı tabloyu kullanmıyorsa metin bozuk çıkar.
İki fikri ayırmak gerekir. Biri karakter kümesidir: hangi sayıların hangi simgelere karşılık geldiğinin listesi. Diğeri bu sayıların baytlar olarak nasıl saklandığıdır. ASCII'de ikisi basitçe örtüşür; Unicode'da örtüşmez ve işte burada UTF-8 devreye girer.
ASCII: 7 bitlik 128 karakter
ASCII (American Standard Code for Information Interchange'in kısaltması) 1960'larda standartlaştırıldı. 7 bit kullanır; yani 2'nin 7. kuvveti = 128 kod, 0'dan 127'ye. Bunların 33'ü kontrol karakteridir (0'dan 31'e ve 127) ve 95'i yazdırılabilirdir (32'den 126'ya, boşluk dahil).
Ç, ğ, ı, ö, ş, ü gibi harfleri ve euro simgesini içermez: İngilizce için tasarlandı. Bu, daha sonra neden başka tablolara ihtiyaç duyulduğunu açıklar.
| Kontrol karakteri | Onluk | Onaltılık | İkili (7 bit) | Ne işe yarar |
|---|---|---|---|---|
| Boş (NUL) | 0 | 00 | 0000000 | Birçok dilde bir dizenin sonunu işaretler |
| Yatay sekme (TAB) | 9 | 09 | 0001001 | Bir sonraki sekme durağına atlar |
| Satır besleme (LF) | 10 | 0A | 0001010 | Bir sonraki satıra iner |
| Satır başı (CR) | 13 | 0D | 0001101 | Satırın başına döner |
| Çıkış (ESC) | 27 | 1B | 0011011 | Kontrol dizilerini başlatır |
| Boşluk | 32 | 20 | 0100000 | İlk yazdırılabilir karakter |
| Silme (DEL) | 127 | 7F | 1111111 | Karakteri siler |
Hatırlamaya değer ilişkiler
Tablo rastgele sıralanmamıştır. Birkaç düzenlilikle kodları ezbere okuyabilirsin.
- “0”dan “9”a kadar rakamlar 48'den 57'ye kadar yer alır (onaltılıkta 30 ile 39). Bir rakamın değeri kodundan 48 çıkarılmış halidir: “7” 55'tir ve 55 − 48 = 7.
- Büyük harfler 65'ten (“A”) 90'a (“Z”), küçük harfler 97'den (“a”) 122'ye (“z”) gider.
- Bir büyük harfle küçüğü arasındaki fark her zaman 32'dir: “A” = 65 ve “a” = 97; “C” = 67 ve “c” = 99. İkilide yalnızca bir bit değişir: “A” için 01000001 ve “a” için 01100001.
- Bir büyük harfin alfabede kaçıncı sırada olduğunu bilmek için 64 çıkar: “C” 67'dir ve 67 − 64 = 3, üçüncü harf.
- Tüm büyük harflerin (65 ile 90) kodları küçük harflerinkinden (97 ile 122) küçük olduğundan, “koda göre” bir alfabetik sıralama “Zeynep”i “ayşe”den önce koyar. Birçok programın doğru sıralamak için ayrı bir karşılaştırma seçeneğine ihtiyacı vardır.
Satır sonu: LF, CR ve CRLF
Bir satır sonu basit görünür, ama sisteme göre farklı yazılır. Unix, Linux ve macOS tek bir karakter kullanır: LF (10). Windows art arda iki tane kullanır, CR ve LF (13 ve 10), yani CRLF. Eski teleprinterlerin iki ayrı komuta ihtiyacı vardı: arabayı başa döndürmek ve kâğıdı bir satır ilerletmek.
Bu fark, basit bir editörde her şeyin tek satırda göründüğü ya da her satırın sonunda tuhaf bir simge bulunduğu dosyaların nedenidir. Her birinin hangi koda sahip olduğunu merak edersen, ASCII tablosunun arama alanına LF ya da CR yaz.
“Genişletilmiş ASCII” bir standart değildir
Bir bayt 8 bit olduğundan ve ASCII yalnızca 7 kullandığından, 128 boş kod kalıyordu (128'den 255'e) ve her üretici ve bölge bunları kendi yöntemiyle doldurdu. Buna “genişletilmiş ASCII” denir, ama tek bir tablo yoktur: kod sayfaları denen birçok tablo vardır. En bilinen ikisi, é harfinin 233 kodu olduğu Latin-1 (ISO-8859-1) ve benzer olan ama 128 ile 159 arası kodlarda farkları bulunan Windows-1252'dir (örneğin euro oradadır). Türkçe için de ISO-8859-9 ve Windows-1254 gibi tablolar vardı.
Sorun şu: 233 kodu bir tabloda “é” anlamına gelir, bir başkasında başka bir şey. Bir tabloyla yazılıp başka bir tabloyla okunan metin çöp gösteriyordu. Unicode bu karmaşayı bitirmek için doğdu.
Unicode ve UTF-8
Unicode, dünyadaki hemen hemen tüm yazı sistemlerinin her karakterine, ayrıca simgelere ve emojilere, kod noktası denen benzersiz bir sayı atar. Bugün 150.000'den fazla karakteri vardır. U+ öneki ve onaltılık olarak yazılır: “A” U+0041, “ç” U+00E7, euro U+20AC ve gülen yüz emojisi U+1F600'dür. İlk 128 kod noktası tam olarak ASCII'dekilerdir.
UTF-8, bu sayıları baytlar olarak saklamanın en çok kullanılan yoludur ve karaktere göre 1 ile 4 arasında bayt kullanır. ASCII'nin 128'i her zamanki gibi tek bir bayt kaplar; bu yüzden bir ASCII metin aynı zamanda geçerli bir UTF-8 metindir. Gerisi daha fazla bayt kaplar.
| Karakter | Kod noktası | UTF-8'de bayt | Baytlar (onaltılık) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| ç | U+00E7 | 2 | C3 A7 |
| ş | U+015F | 2 | C5 9F |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
“ç” yerine neden “ç” görünür
En yaygın hatadır ve kesin bir açıklaması var. UTF-8'de ç iki bayttır: C3 ve A7. Bir program metnin Latin-1'de olduğunu sanırsa her baytı bir karakter olarak okur: C3 “Ô, A7 ise “§”dir. Sonuç: “ç”. Aynı şey “ü” ile de olur, “ü” görünür, ve “çok” kelimesi “çok” olarak çıkar.
Çözüm neredeyse her zaman programa dosyayı UTF-8 olarak açmasını söylemektir (bir metin editöründe ya da bir hesap tablosunun içe aktarma ayarlarında). Tersi olduğunda, yani Latin-1 metin UTF-8 olarak okunduğunda, genellikle soru işaretli eşkenar dörtgenler çıkar, çünkü bu tekil baytlar geçerli UTF-8 dizileri oluşturmaz.
ASCII tablosu ve çevirici nasıl kullanılır
“ASCII tablosu” aracı 128 karakteri onluk, onaltılık, sekizlik ve ikili kodlarıyla ve kontrol karakterlerinin adıyla birlikte gösterir.
- Satırını bulmak için arama alanına bir karakter, bir kod ya da bir kontrol karakterinin adını yaz (örneğin A, 65, 41 ya da LF).
- Yalnızca bir grubu görmek için filtre düğmelerini kullan (Kontrol, Rakamlar, Büyük harfler, Küçük harfler, İşaretler).
- Çevirmek için “Metin” alanına bir metin yaz ve biçimi seç (ondalık, onaltılık, sekizlik ya da ikilik): altta kodlar görünür. “Hello” onlukta 72 101 108 108 111 ve onaltılıkta 48 65 6C 6C 6F verir.
- Tersini de yapabilirsin: boşluk ya da virgülle ayrılmış kodları “Kodlar” alanına yapıştır ve metin oluşur. Onaltılıkta 0x41 gibi önekler kabul edilir.
Metinde ç gibi ASCII olmayan karakterler varsa araç bunu bildirir ve Unicode kodunu gösterir. UTF-8'deki gerçek baytları görmek için “Metni binary koda çevirme” aracını kullan: ç 11000011 10100111 verir; 8 bitlik iki bayt. Sınırlar: tablo yalnızca standart ASCII'yi gösterir, genişletilmişi değil ve her şey tarayıcında hesaplanır, metin hiçbir sunucuya gönderilmez.
Sık sorulan sorular
ASCII kaç karakterden oluşur?
128; kodlar 0'dan 127'ye ve her biri 7 bit. Bunların 33'ü kontrol, 95'i yazdırılabilir karakterdir; boşluk dahil.
A ve a harflerinin ASCII kodu nedir?
“A” 65 (onaltılıkta 41, ikilide 01000001) ve “a” 97 (onaltılıkta 61, ikilide 01100001). Aralarında her zaman 32 fark vardır.
ASCII ile Unicode arasındaki fark nedir?
ASCII, İngilizce için düşünülmüş 128 karakterdir. Unicode'un neredeyse tüm dillerden ve emojilerden 150.000'den fazla karakteri vardır ve ilk 128'i ASCII'dekilerle aynıdır.
UTF-8 nedir?
Unicode metnini baytlar olarak saklamanın en çok kullanılan yoludur. Karakter başına 1 ile 4 bayt kullanır: ASCII olanlar bir, bir ç iki ve bir emoji dört bayt kaplar.
Metnim neden “ç” ya da “ü” gösteriyor?
Çünkü UTF-8 olarak kaydedilmiş bir metin Latin-1 olarak okunuyor. Dosyayı UTF-8 kodlamasını belirterek aç ve sorun çözülür.