8.1. C Dünyanın Her Yerinde—Yöreler
Bilginin gösterim yolları ülkeden ülkeye değişir. Örneğin, tarih yazılırken, Türkçede önce gün, sonra ay yazılır. Bazı batı ülkelerinde ise bunun tersi yapılır. İngilizcede ondalık sayıları ayırmak için nokta kullanılırken, başka ülkelerde virgül kullanılır. Ve, en önemlisi de, her ülkenin kendine özgü harfleri vardır ve bütün dillerin bütün karakterlerini ifade edebilecek tek bir karakter takımının kullanılmadığı ortamlar olabilir.
Bu konuya bir çözüm getirmek için yöreler kavramı
getirilmiştir. Bir yöre, belirli bir ülke veya dil için yukarıdaki
paragrafta sözü edilen türden bilgileri içeren bir bilgi paketidir.
Yöreler, ctype
fonksiyonlarını, yazı yazma yönünü,
saat-tarih biçimlerini, karakterlerin sırasını ve ondalıkları ayırmak için
kullanılan karakteri belirlerler. Yeni bir yöre belirterek,
printf
gibi, birçok standart fonksiyonu etkilemek olasıdır.
Kullanılmakta olan yöre ile ilgili bilgileri lconv
yapısı
tutar ve buna bir gösterge elde etmek için localeconv
adlı
fonksiyonu çağırmak gerekir. Yürütme esnasında yöreyi belirtmek için, şu iki
argümanı olan setlocale
adlı fonksiyonu çağırırsınız:
Değiştirmek istediğiniz özelliklerden oluşan grup (LC_COLLATE
[karakter sırası], LC_CTYPE
[karakter tipi],
LC_MONETARY
[para], LC_NUMERIC
[sayılar],
LC_TIME
[zaman], LC_ALL
[hepsi]) ve yeni
özelliklerin alınacağı yörenin adı. Eğer bütün diller için yöreler
tanımlanmışsa, programın başında kullanıcının milliyetini sorup
ondan sonra bu kişinin alıştığı şekilde çalışan bir program yazılabilir.
Örneğin,
setlocale(LC_ALL, turkish)
Standart sadece C
yöresinin gerçekleştirilmesini
gerektirmektedir. Bu da, kitap boyunca anlatılan özelliklerden
oluşmaktadır.
Örnek olarak, aşağıdaki program bizim sistemimizde
bir para miktarını, önce ortamdaki geçerli olan yöreye, sonra C
yöresine
uygun biçimde, daha sonra da Türkiye, İngiltere, A.B.D. ve Fransa’ya
(ASCII ve UTF8 karakterler kullanarak) uygun bir şekilde ekrana yazacaktır.
#include <locale.h> #include <stdio.h> void parabas (double para, char * dil) { struct lconv * cl; printf ("%10s : %10s : ", dil, setlocale(LC_ALL, dil)); cl = localeconv(); printf("%5.2lf %s %s\n", para, cl->currency_symbol, cl->int_curr_symbol); } /* parabas */ int main (void) { parabas(9.90, ""); parabas(9.90, "C"); parabas(9.90, "tr_TR"); parabas(9.90, "tr_TR.UTF8"); parabas(9.90, "en_GB"); parabas(9.90, "en_GB.UTF8"); parabas(9.90, "en_US"); parabas(9.90, "en_US.UTF8"); parabas(9.90, "fr_FR"); parabas(9.90, "fr_FR.UTF8"); } /* main */
Örnek bir çıktı aşağıda verilmiştir:
: tr_TR.UTF8 : 9,90 ₺ TRY C : C : 9.90 tr_TR : tr_TR : 9,90 TL TRY tr_TR.UTF8 : tr_TR.UTF8 : 9,90 ₺ TRY en_GB : en_GB : 9.90 � GBP en_GB.UTF8 : en_GB.UTF8 : 9.90 £ GBP en_US : en_US : 9.90 $ USD en_US.UTF8 : en_US.UTF8 : 9.90 $ USD fr_FR : (null) : 9.90 $ USD fr_FR.UTF8 : (null) : 9.90 $ USD
Eğer setlocale
fonksiyonuna ikinci argüman olarak verilen
yeni yöre, ortamınız tarafından desteklenen bir yöre tanımına denk geliyorsa,
bu fonksiyon yeni yöreyi devreye sokar ve bu yörenin ismini içeren bir
karakter dizisi döndürür. Eğer verilen argüman ortamınız için
geçerli değilse, setlocale
fonksiyonu NULL
döndürecektir. Yukarıdaki son iki satır buna örnektir.