Soysal Dönüşüm Arayüzü
Önceki Soysal Karakter Kümesi Dönüşümü Sonraki
Soysal Dönüşüm Arayüzü
Bu işlev ailesi bir özkaynağın geleneksel kullanım yöntemini kullanır: aç-kullan-kapa. Arayüz her biri bir adımı gerçekleştiren üç işlevden oluşur.
Arayüzün açıklanmasına geçmeden önce bir veri türünden bahsetmemiz gerekiyor. Diğer aç-kullan-kapa arayüzler gibi burada bahsedilen işlevler de tanımlayıcıları kullanarak çalışır. Bu tanımlayıcıların kullandığı özel veri türü iconv.h başlık dosyasında tanımlanmıştır.
iconv_t
veri türü
Bu veri türü iconv.h dosyasında tanımlanmış bir soyut türdür. Yazılımcı bu veri türünün tanımıyla ilgili hiçbir kabul yapmamalıdır; şeffaf olmayan bir türdür.
Bu türdeki nesneler iconv işlevleri kullanılan dönüşümler için atanmış tanımlayıcıları alabilir. Tanımlayıcıyı kullanan dönüşümlerin nesneyi serbest bırakması gerektiğinden nesnelerin kendi kendilerini serbest bırakmaması gerekir.
İlk adım bir eylemci oluşturan işlevdir.
iconv_t iconv_open
(const char *hedef_kod,
 const char *kaynak_kod)
işlev
iconv_open işlevi bir dönüşüm başlatmadan önce kullanılması gereken işlevdir. İşlev, dönüşüm için kullanılacak karakter kümelerinin belirtildiği iki argüman alır. Gerçekleme böyle bir dönüşümü yapabilecek yeterlilikteyse işlev bir tanımlayıcı ile döner.
İstenen dönüşüm mümkün değilse işlev, (iconv_t) -1 ile döner. Bu durumda errno genel değişkenine şu değerlerden biri atanır:
EMFILE
Süreç zaten OPEN_MAX dosya tanımlayıcı açmış.
ENFILE
Sisemin açık dosya sayısı ile ilgili sınırı aşıldı.
ENOMEM
İşlemi gerçekleştirecek kadar bellek yok.
EINVAL
kaynak_kod ile hedef_kod arasında dönüşüm desteklenmiyor.
Bağımsız dönüşümleri yapacak farklı evrelerde aynı tanımlayıcıyı kullanmak mümkün değildir. Tanımlayıcı ile ilişkili veri yapıları dönüşüm durumu hakkında bilgi içerir. Bu farklı dönüşümlerde kullanılarak altüst edilmemelidir.
Bir iconv tanımlayıcı bir dosya tanımlayıcı gibi her kullanım için yeniden oluşturulmalıdır. Tanımlayıcı kaynak_kod ile hedef_kod arasındaki tüm dönüşümler içindir şeklinde düşünülmemelidir.
GNU C kütüphanesinin iconv_open gerçeklemesi diğer gerçeklemelerden farklı olarak önemli bir özelliğe sahiptir. Dönüşüm için desteklenen tüm karakter kümeleri ile ilgili verileri ve kodları içeren dosyalar belli başlı dizinlerde tutulur. Bu özelliğin nasıl gerçeklendiği glibc iconv Gerçeklemesi bölümünde açıklanmıştır. Burada üstünde duracağımız tek şey, GCONV_PATH ortam değişkeninde ismi bulunan dizinlerin sadece bir gconv-modules dosyası içermesi halinde geçerli olduğudur. Bu dizinlerin sistem yönetici tarafından oluşturulması şart değildir. Aslında bu özellik kullanıcıların kendilerine özel dönüşümleri yazabilmelerine ve kullanabilmelerine imkan vermek için tasarlanmıştır. Şüphesiz, güvenlik kaygıları nedeniyle SUID çalıştırılabilirlerle bu çalışmaz; bu durumda sadece sistem dizinlerine bakılır. Bunun yeri de normalde önek/lib/gconv dizinidir. GCONV_PATH ortam değişkenine sadece iconv_open işlevi ilk çağrıldığında bakılır. Değişkende sonradan yapılan bir değişikliğin etkisi yoktur.
iconv_open işlevi ilk olarak X/Open Portability Guide, 2. sürümünde kullanıldı. Daha sonra tüm ticari Unix'ler tarafından desteklendi. Bununla birlikte, gerçeklemenin kalitesi ve bütünlüğü aynı değildir. iconv_open işlevi iconv.h dosyasında bildirilmiştir.
iconv gerçeklemesinin geniş veri yapısı iconv_open tarafından döndürülen tanımlayıcı ile ilişkilendirilebilir. Diğer taraftan, tüm dönüşümler yapıldıktan sonra ve başka dönüşüm kalmamışsa tüm özkaynakların hemen serbest bırakılması önemlidir.
int iconv_close
(iconv_t dt)
işlev
iconv_close işlevi önceki bir iconv_open çağrısından dönen dt tanımlayıcısı ile ilişkili tüm özkaynakları serbest bırakır.
İşlev hatasız bir işlem yürütmüşse 0 ile döner, aksi takdirde errno değişkenine hata durumunu kaydederek -1 ile döner. İşlev için tanımlı hatalar:
EBADF
Dönüşüm tanımlayıcı geçersiz.
iconv_close işlevi diğer iconv işlevleri ile birlikte XPG2 içinde tanımlanmış ve iconv.h dosyasında bildirilmiştir.
Standart aslında tek bir dönüşüm işlevi tanımlar. Bu çok genel bir arayüz tanımlandığı için böyledir: Dönüşümün bir tampondan diğerine yapılacağı öngörülmüştür. Bir dosyadan tampona ve tersi ya da dosyadan dosyaya dönüşümler standarttaki bu tanımı genişleterek gerçekleştirilebilir.
size_t iconv
(iconv_t dt,
 char  **girdi_tamponu,
 size_t *girdi_uzunluğu,
 char  **çıktı_tamponu,
 size_t *çıktı_uzunluğu)
işlev
iconv işlevi dt dönüşüm tanımlayıcısı ile ilişkilendirilmiş kurallara uygun olarak girdi tamponundaki metni dönüştürerek sonucu çıktı tamponunda saklar. Gerekli durum bilgisi tanımlayıcı ile ilişkilendirilmiş veri yapıları içinde tutulduğundan aynı metin için işlev defalarca çağrılabilir.
*girdi_tamponu ile belirtilen girdi tamponu *girdi_uzunluğu bayt içerir. Kullanılan girdinin çağrıcı ile iletişimi için ek olarak bir dolaylı işlem gerekir. Tampon göstericisinin char türünde olduğuna dikkat edin. Uzunluk, tampondaki karakterler geniş karakterler olsa bile bayt cinsindendir.
Çıktı tamponu da benzer şekilde sonucun saklanacağı *çıktı_tamponu göstericisinin belirtiği adresten başlayan en az *çıktı_uzunluğu baytlık bir alan olarak belirtilir. Yine benzer şekilde tampon göstericisi char türündedir ve tampon uzunluğu bayt cinsindendir. çıktı_tamponu veya *çıktı_tamponu bir boş gösterici ise dönüşüm yine yapılır ama bir çıktı üretilmez.
girdi_tamponu bir boş gösterici ise, dönüşüm durumunu ilk duruma getiren bir eylem gerçekleştirilir. Bu, durumsal olmayan kodlamalarda bir eylemle sonuçlanmaz, ama eğer, kodlama bir duruma sahipse böyle bir işlev çağrısı gerekli durum değişikliklerini gerçekleştirecek bazı bayt dizilimlerini çıktı tamponuna koyar. Normal bir girdi_tamponu ile yapılan bir sonraki işlev çağrısında dönüşüm ilk durumdan başlar. Yazılımcının dönüşümün durumsallığı ile ilgili bir önkabul yapmaktan kaçınması gerekir. Girdi ve çıktı karakterleri durumsal olmasa bile gerçekleme yine de durumları tutmak zorunda olabilir. Aşağıda açıklanan sebeplerden dolayı GNU C kütüphanesinde bu böyledir. Bu nedenle, durumu sıfırlayacak bir iconv çağrısı, bir protokol, çıktı metni için bunu gerektiriyorsa daima bunu yapacaktır.
Dönüşüm üç sebepten birine bağlı olarak durabilir. İlki girdi tamponundaki tüm karakterlerin dönüştürüldüğü durumdur. Bu aslında iki farklı anlama gelir: Ya girdi tamponundaki tüm karakterler tüketilmiştir ya da tamponun sonunda girdide eksik ama tamponda tam biçimde olan bazı baytlar bulunmuştur. Durmanın ikinci sebebi çıktı tamponunun dolmasıdır. Üçüncüsü ise girdinin geçersiz karakterler içermesidir.
Bu durumların hepsinde sorunsuz yapılan son dönüşümün ardından girdi ve çıktı tamponları girdi_tamponu ve çıktı_tamponu'nda ve her tamponun uzunluğu sırayla girdi_uzunluğu ve çıktı_uzunluğu göstericileriyle döndürülür.
iconv_open çağrısında seçilen karakter kümeleri hemen hemen tamamen isteğe bağlı olduğundan girdi karakter kümesinde, çıktı karakter kümesinde karşılığı olmayan karakterler bulunabilir. Bu durumda işlevin davranışı tanımsızdır. GNU C kütüphanesinin bu durum karşısında şimdiki davranışı bir hata durumu ile dönmektir. Bu olması gereken bir çözüm değildir; bu nedenle, daha iyi bir çözüm için çalışmalar sürmektedir ve kütüphanenin gelecek sürümlerinde daha iyi bir çözüm sunulacaktır.
Girdi tamponundaki karakterlerin tümü değiştirilip sonuç çıktı tamponunda saklanmışsa, işlev tersinir olmayan dönüşümlerin sayısı ile döner. Bunun dışındaki tüm durumlarda işlev (size_t) -1 ile döner ve errno değişkenine hata durumunu kaydeder. Böyle durumlarda girdi_uzunluğu ile gösterilen değer sıfırdan farklıdır.
EILSEQ
Girdi geçersiz bir bayt dizilimi içerdiğinden dönüşüm durdu. Çağrıdan sonra, *girdi_tamponu geçerli bayt dizilimlerinin ilk baytını gösterir.
E2BIG
Çıktı tamponu yetersiz olduğundan dönüşüm durdu.
EINVAL
Girdi tamponunun sonundaki bayt dizilimi eksik olduğundan dönüşüm durdu.
EBADF
dt argümanı geçersiz.
iconv işlevinden XPG2 standardında bahsedilmiş ve işlev iconv.h başlık dosyasında bildirilmiştir.
iconv işlevi, benzerlerinden daha iyi gerçeklenmiştir. Daha esnek bir işlevsellik sunar. Sorunlu kısımlar, geçersiz girdi ve girdi tamponunun sonundaki geçersiz bayt dizilimlerinin olduğu durumlardır. Üçüncü bir sorun varsa da, bu bir tasarım sorunu değildir, dönüşümlerin seçimi ile ilgilidir. Standart meşru isimler hakkında birşey içermez. Bunun diğer gerçeklemeleri nasıl olumsuz etkilediğini sonraki bölümde bir örnekle göstereceğiz.
Önceki Üst Ana Başlık Sonraki
Soysal Karakter Kümesi Dönüşümü Başlangıç iconv Örnekleri
Bir Linux Kitaplığı Sayfası