Öteleme Durumu
Önceki Evresel Olmayan Dönüşümler Sonraki
Öteleme Durumu
Bazı çokbaytlı karakterlerin bayt dizilimleri tek başlarına anlamlı değildir; dizge içindeki kendilerinden önce gelen karakterlere bağlı olarak değerlendirilir. Kendinden sonraki dizilimlerin anlamını değiştiren belli başlı birkaç dizilim vardır. Bu dizilimlere öteleme dizilimleri ve bunların hepsine birden öteleme durumu denir.
Öteleme dizilimlerini ve öteleme durumunu bir örnekle açıklayalım. 0200 dizilimi (bir baytlık) Japonca kipini başlatır ve bu dizilimden sonra gelen 0240 ile 0377 arasındaki bayt çiftleri birer karakter olarak yorumlanır. Aynı şeklide, 0201 ile Latin-1 kipine girilir ve 0240 ile 0377 arasındaki karakterler Latin-1 karakter kümesindeki karakterler olarak yorumlanır. Burada iki öteleme durumu (Japonca ve Latin-1 kipi) olan bir çokbaytlı kod ile belli öteleme durumlarını belirten iki öteleme diziliminden bahsetmiş olduk.
Kullanımdaki çokbaytlı karakter kodu için öteleme durumları varsa, mblen, mbtowc ve wctomb işlevleri taradıkları dizgenin mevcut öteleme durumlarını düzenlemeli ve güncellemelidir. Bunun olması için bu kurallara uymalısınız:
  • Bir dizgeyi taramaya başlamadan önce, çokbaytlı karakter adresi için işlevi mblen (NULL, 0) gibi bir boş gösterici ile çağırın. Bu öteleme durumunu işlevin kendi standart ilk değeriyle ilklendirecektir.
  • Dizgeyi sırayla bir defada bir karakter işlenecek şekilde tarayın. Taradığınız karakterleri yedeklemeyin ve yeniden taramayın ve bu arada başka dizgeleri işleme sokmayın.
mblen işlevinin bu kurallara uygun olarak kullanımına bir örnek:
void
scan_string (char *s)
{
  int length = strlen (s);

  /* Öteleme durumunu ilklendirelim.  */
  mblen (NULL, 0);

  while (1)
    {
      int thischar = mblen (s, length);
      /* Dizge sonunu ve geçersiz bir karakteri yakalayalım.  */
      if (thischar == 0)
        break;
      if (thischar == -1)
        {
          error ("çokbaytli karakter gecersiz");
          break;
        }
      /* Sonraki karaktere geçelim.  */
      s += thischar;
      length -= thischar;
    }
}
mblen, mbtowc ve wctomb işlevleri öteleme durumu kullanan bir çokbaytlı kod için evresel değildir. Bununla birlikte, bu işlevleri çağıran bir kütüphane işlevi olmadığından öteleme durumunun bilginiz dışında değişmesi mümkün değildir.
Önceki Üst Ana Başlık Sonraki
Evresel Olmayan Dizge Dönüşümleri Başlangıç Soysal Karakter Kümesi Dönüşümü
Bir Linux Kitaplığı Sayfası