Thread overview
wstring
Mar 21, 2018
hsencan
Mar 21, 2018
kerdemdemir
March 21, 2018

Merhaba,

wstring,wchar_t tipleri ne işe yarıyorlar,ve nerede kullanılıyorlar ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 21, 2018

Eskiden D 'de yer zaman 4 byte sabit diye utf32 'i temsil eden dstring 'i kullanmak zorunda kalıyorduk çok nadirde olsa.
Benim stratejim ne zaman anlamadığım bir derleme hatası alırsam dstring 'e dönüştürmekti. Son zamanlarda bu hatayı çok almıyorum ama alsam yine dstring'e çeviririm.

Ali Abi bu konuyu açma fırsatın olurmu?

Hangi durumlarda utf32 'i kullanan dstring'e mecbur kalıyoruz. Eğer mümkünse utf8 'i desteklemeyen std fonksiyonlarının en popülerlerinden bir kaçını yazma şansın olurmu?

Erdemdem.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 21, 2018

string'in elemanları char'dır. Her ne kadar standart char'ın büyüklüğünü kısıtlamasa da artık her yerde 8 bit olduğunu kabul edebiliriz. Özel anlamları olan kontrol karakterlerini çıkartınca 8 bit ile ifade edilebilen karakter sayısı çok azdır. (Türkçe için sorun değil ama birden fazla alfabeyi desteklemek isteyince yetmez.) Buna rağmen, birden fazla 8 bitlik birimle ifade edilen Unicode'un UTF-8 gibi kodlamalarında 8 bit kullanılır.

wchar_t, örneğin 16 bit olduğundan örneğin 60 bin karakteri ifade edebilir. wstring, string'in eleman olarak wchar_t kullananıdır.

Windows arayüzünde wide string kullanan işlevlerde işe yarıyor galiba ama artık UTF-8'in yerleşmiş olduğunu düşünebiliriz. wstring D'de de hemen hemen hiç kullanılmıyor.

Benim bu konuda bildiklerim şurada:

http://ddili.org/ders/d/karakterler.html

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 21, 2018

dstring'in avantajı, UTF-32 kodlaması olduğundan rastgele erişime olanak vermesi. Yani, RandomAccessRange olarak kullanılabiliyor.

UTF-8'de karakterler farklı sayıda char'dan oluşabildiklerinden string'in istediğimiz noktasına erişme şansımız yok. Böyle bakınca sanki string yetersizmiş gibi görünebiliyor. Ancak, düşününce öyle olmadığı en az iki noktayla kanıtlanabilir:

  1. C ve başka dillerden alışık olmamızın aksine, dizgiler rasgele erişilen veri yapıları değildir. Çoğu durumda dizgileri ekrana bir şey yazmak için başından sonuna doğru kullanırız. Rasgele erişilen durumlar genellikle karakterleri büyük veya küçük harfe çevirmek için gerekirmiş gibi görünür ama aslında rasgele erişim orada da şart değildir: dizgi başından sonuna doğru erişerek de değiştirilebilir. Hele D'nin aralık işlevlerini düşününce...

  2. dstring bile olsa rasgele erişim Unicode dizgilerine uygun değildir çünkü dstring'de bile insanların "karakter" diye algıladığı şeyler birden fazla dchar'dan oluşabilir. Unicode bu konuda fazla esnek: Örneğin, dstring "aç" ise her iki karakter s[0] ve s[1] diye erişilerek değiştirilebilir. Ancak, Unicode "aç"nin başka biçimde ifade edilmesine de izin verir; şu üç Unicode karakteri olarak: a, c, ve "combining cedilla". Combining cedilla, öncesindeki karakterin altına gelen ç kancasıdır. Unicode'un gözünde "aç" ve o üç karakter aynı oldukları halde bilgisayar sistemlerinde aynı değillerdir. Örneğin, böyle bir dizginin s[0] ve s[1] karakterleri değiştirildiğinde şu üç karakter oluşur: c, a, ve "combining cedilla". Yani, kanca a'nın altına gelir.

Dolayısıyla, dstring'i rasgele erişimle kullanabilmek için dizgide böyle gariplikler olmadığından da emin olmak gerekir.

dstring'in veya dchar karşımıza çıkmasının bir nedeni, Phobos işlevlerinin "auto decoding" denen ama herkes tarafından sevilmeyen bir huylarının olmasıdır: Kullanışlı olma adına, string üzerinde ilerlerken UTF-8 otomatik olarak ayrıştırılır ("decode edilir") ve işlevler bize char değil, dchar gösterirler. Kullanışlıdır çünkü Unicode karakter parçalarına değil, Unicode karakterlerine erişmiş oluruz. Ama bunun bir bedeli var: elemanları char olan string'de ilerlerken karşımıza dchar elemanlar çıkar:

import std.range;

void main() {
   auto s = "dünya";
   assert(s.length == 6);
   // Çünkü 'ü' iki char'dan oluşur

   auto aralık = s.take(5);

   static assert(is (ElementType!(typeof(aralık)) == dchar));
   assert(aralık.walkLength == 5);
   // Çünkü otomatik olarak çözümlenmiştir ve 'ü' dchar olarak sunulmuştur
}

Senin de gözlemlediğin gibi, D'ye alıştıkça daha çok string kullanıyoruz ve dchar'la daha az karşılaşıyoruz. (Aslında daha sık karşılaşıyoruz ama bu daha az sorun oluşturuyor. :) )

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]