UNICODE Karakter Tablolama Sistemi
işletim |
ASCII tablosunda her
karakter 1 byte yer kaplayacak biçimde tutulur. Bu durum ancak 256 değişik
karakterin ifade edileceği anlamına gelir. Son yıllarda her bir karakterin 2
byte ile ifade edildiği UNICODE tablolama sistemi ASCII sistemiyle birlikte
kullanılmaya başlanmıştır. UNICODE tablosunun ilk 256 karakteri ASCII
tablosundaki karakterlerin aynsıdır. Bu tabloda dünyadaki bütün ulslara ilişkin
harf simgeleri vardır.
Bir UNICODE karakter C'de unsigned short int türüyle ifade edilir.
Bu tür şimdilik her sistemde 2 byte uzunluğundadır. Windows.h içerisinde typedef unsigned short int wchar_t biçiminde
ve typedef wchar_t WCHAR biçiminde
iki typedef ifadesi vardır. C++'ta 1996 standardında wchar_t bir anahtar
sözcüktür. wchar_t C++'ta 2 byte uzunluğunda işaretsiz bir tam sayı türünü
belirtir. UNICODE bir yazı wchar_t türünden bir yazı içerisinde saklanabilir.
C'de normal string'ler birer byte uzunluğunda ASCII değerleriyle belleğe
yerleştirilirler. Bir string'in başına L getirilirse (L"string" gibi)
UNICODE string elde edilir. Bu durumda derleyici string'in herbir karakterini
iki byte uzunluğunda UNICODE karakter tablosuna uygun olarak yerleştirir. NULL
karakter iki byte uzunluğunda 0 biçimindedir. Derleyici UNICODE string yerine
wchar_t türünden bir adres yerleştirir. C'de çalışıyorsak bu adres unsigned
short int türünden bir adrestir. C++'ta çalışıyorsak wchar_t türündendir.
Örneğin:
UNICODE karakter sabiti de söz konusudur. UNICODE karaketre sabitleri L'a'
biçiminde belirtilir. Tabii wchar_t türünden bir değişkene doğrudan bir ASCII
karakter sabiti atanabilir(C'de farklı türden bilgiler birbirlerine
atanabilir).
Ancak yine de okunabilirlik bakımından atamanın şu biçimde yapılması
tavsiye edilir.
Bir programın UNICODE ve
ASCII version'larının kolaylıkla elde edilebilmesi için şöyle bir sistem
düşünülmüştür:
Eğer program içerisinde
her zaman TCHAR ismi kullanılırsa windows.h include ifadesinin yukarısına #define UNICODE yazılıdğında bütün
TCHAR'lar wchar_t yazılmadığında ise bütün TCHAR'lar char anlamına gelirler.
Yani bütün program TCHAR ismini kullanacak biçimde yazılmalıdır. Tabii bir
string'in de otomatik olarak UNICODE ya da ASCII string biçiminde kolay bir
dönüştürmeye tabii tutulması gerekmektedir. Bu işlem TEXT makrosuyla
yapılmaktadır.
Bu makro windows.h
içerisinde tanımlanmıştır. Görüldüğü gibi eğer UNICODE sembolik sabiti
tanımlanmış ise TEXT("ali") gibi bir makro ön işlemci tarafından
L"ali" biçimine dönüştürülür. Eğer UNICODE sembolik sabiti
TEXT("ali") "ali" biçimine dönüştürülür. TEXT makrosu
karakter sabitleri için de kullanılabilir. Sonuç olarak bir programı ASCII ve
UNICODE uyumlu yazabilmek için:
1. char ya da wchar_t yerine her zaman TCHAR kullanılmalı,
2. UNICODE string ya da ASCII string yerine her zaman TEXT makrosu
kullanılmalıdır.
Yazı Parametresi Alan API Fonksiyonları
Bir
yazıyı parametre olarak alan API fonksiyonlarından gerçekte iki tane vardır:
ASCII ve UNICODE versiyonları. Örneğin, MessageBox fonksiyonundan iki tane
vardır: MessageBoxA, MessageBoxW. Aslında 32 bit Wndows sistemlerinde 16 bit
Windows sistemlerindeki gibi MessageBox isimli bir fonksiyon yoktur. MessageBox
yazıldığı zaman ön işlemci, UNICODE sembolik sabitinin tanımlanıp
tanımlanmadığına göre bunu MessageBoxA ya da MessageBoxW şekline döndürür.
Tabii, bu fonksiyonların UNICODE versiyonlarında parametreler wchar_t *
biçiminde ASCII versiyonları char * biçimindedir. Örneğin, MessageBox API
fonksiyonu için windows.h içerisinde şu biçimde bir işleme sokulmuştur.
ASCII ve UNICODE Uyumlu Tür İsimleri
Unıcode
sembolik sabitine bağımlı olan iki tür ismi vardır. Yani bu durumda LPTSTR ve
LPCSTR duruma göre wchar_t ya da char * olmaktadır. Aslında bu türler
gösterimlerde daha çok iki versiyonu olan API fonksiyonlarının parametrelerini
belirtmek için kullanılır.Örneğin MessageBox fonksiyonun prototipi şöyledir:
C’ nin
standart string fonksiyonları (örneğin; strlen(), strcpy() gibi) default olarak
ASCII sistemine göre çalışmaktadır. Bütün bu fonksiyonların ayrıcaUNICODE
versiyonları da vardır. Ancak en iyisi bu fonksiyonların UNICODE duyarlı
isimlerini kullanmaktır. UNICODE duyarlı isimler tchar.h dosyasında
tanımlanmıştır. Bu yüzden bu dosyanın da include edilmesi gerekir. Ancak bu
duyarlılık, UNICODE değil _UNICODE ismine göre yazılmıştır. Örneğin, tchar.h
içerisinde şöyle bir _tcslen ismi strlen fonksiyonunun _UNICODE duyarlı
biçimidir.
Bunların
dışında tchar.h içeriside TEXT makrosu gibi ancak _UNICODE sembolik sabitine duyarlı
_T, __T, _TEXT makroları da vardır.
Sonuç olarak, durum biraz karışmış olmasına karşın, şu özet notlar alınabilir:
1. UNICODE ve ASCII string elde etmek için TEXT,
_T, _TEXT, __T makrolarının hepsi kullanılabilir. ancak TEXT UNICODE sözcüğüne diğerleri ise
_UNICODE sözcüğüne duyarlıdır. Tabii TEXT dışındakilerde tchar.h dosyasının
include edilmesi gerekir.
2. TCHAR türü UNICODE duyarlı bir türdür. Yani
yalnızca windows.h dosyasının include edilmesiyle kullanılabilir.
3. Bir yazıyı parametre olarak alan API
fonksiyonlarından ASCII ve UNICODE olmak üzere ikişer tane vardır.
0 yorum: