Dönüşüm Seçimi
Önceki Geridönüşümlü Çok Baytlı Dönüşüm Sonraki
Dönüşüm Seçimi
Burada açıklayacağımız işlevler tarafından uygulanan dönüşümlerde önceki bölümde bahsettiğimiz gibi seçilen yerelin LC_CTYPE kategorisi tarafından belirlenen karakter kümesi kullanılır. Her yerelin (localedef'e argüman olarak verilen) kendi karakter kümesi vardır ve bunun harici çokbaytlı kodlamalardan biri olduğu kabul edilir. Geniş karakterli karakter kümesi daima UCS-4'tür, en azından GNU sistemlerinde böyledir.
Her çokbaytlı karakter kümesinin karakteristik özelliklerinden biri, bir karakteri göstermek için gereken en fazla bayt sayısıdır. Bu, dönüşüm işlevlerinin kullanıldığı bir kodu yazarken oldukça önemli bir bilgidir (örnekleri aşağıda görülebilir). Bu bilgiyi sağlamak için ISO C standardı iki makro tanımlar.
int MB_LEN_MAX
makro
MB_LEN_MAX desteklenen yerellerin hepsi için tek bir karakterin çokbaytlı gösteriminde olabilecek en fazla bayt sayısını belirtir. Bir derleme zamanı sabitidir ve limits.h başlık dosyasında tanımlanmıştır.
int MB_CUR_MAX
makro
MB_CUR_MAX o an geçerli olan yereldeki bir çokbaytlı karakterde olabilecek en fazla bayt sayısı olan bir pozitif tamsayı ifadeye genişletilir. Değeri hiçbir zaman MB_LEN_MAX'dan büyük olamaz. MB_LEN_MAX'ın tersine bu makronun bir derleme zamanı sabiti olması gerekmez ve GNU C kütüphanesinde de değildir.
MB_CUR_MAX stdlib.h başlık dosyasında tanımlanmıştır.
ISO C derleyicileri değişken uzunluklu dizi tanımlarına kesinlikle izin vermediğinden iki farklı makro gereklidir, ancak yine de özdevimli bellek ayırmadan kaçınılması istenir. Kodun bu eksik parçası aşağıdaki soruna yol açar.
{
  char tampon[MB_LEN_MAX];
  ssize_t uzunluk = 0;

  while (! feof (fp))
    {
      fread (tampon[uzunluk], 1, MB_CUR_MAX - uzunluk, fp);
      /* … tamponu işle */
      uzunluk -= kullanilan;
    }
}
İç döngüdeki kod tek bir çokbaytlı karaktere çevrilmesi için tampon dizisinde daima yeterli bayt bulunduğu varsayımına dayanır. Çoğu derleyici değişken uzunluktaki dizilere izin vermediğinden tampon dizisi sabit uzunluktadır. fread çağrısı tampon dizisinde daima MB_CUR_MAX bayt olduğundan emin olarak yapılır. Burada MB_CUR_MAX bir derleme zamanı sabiti değilse bir sorun çıkmaz.
Önceki Üst Ana Başlık Sonraki
Geridönüşümlü Çok Baytlı Dönüşüm Başlangıç Durumun saklanması
Bir Linux Kitaplığı Sayfası