Standart C Programlama Dili


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.