Ortalık çok karıştı. :)
Alıntı (emre413):
>
> extern(C) {
> int wprintf(const wchar *format,...);
> }
> ```
Tamam, wprintf bir wchar* göstergesi alıyormuş.
Alıntı (emre413):
>
> wprintf("Türkçe Karakterler: ı I İ i ö Ö ü Ü ğ Ğ ç Ç ş Ş");
O satır derleniyor mu? O dizgi hazır değerinin türü string olmalı (yani, değişmez char dizisi). Otomatik tür dönüşümü olduğunu sanmıyorum. Onun için dizginin sonunda w karakteri olmalı: "merhaba"w gibi... Sonra .ptr niteliği ile veya ilk karakterinin adresi ile wchar* elde edilir. (O da, dizgi hazır değerleri '\0' ile sonlandıkları için çalışır. Yoksa, herhangi bir dizginin sonunda '\0' yoktur.) Yani, "merhaba"w.ptr gibi deneyebilirsin.
Alıntı (emre413):
> wprintf tanımında wchar_t yerine wchar kullandım
O bir yere kadar çalışır. Windows'un wchar_t'si UTF-16 değildir ama D'nin wchar'ı UTF-16'dır. Buna rağmen bizi ilgilendirmeyen bazı Unicode karakterleri dışında kodlar birbirlerini tutar. (Windows Unicode'u çok geç anlayabilmiştir.)n
Alıntı:
> karakterler doğru basılmadı
Elimde Windows sistemi olmadığı için yardım da edemiyorum.
Ama biraz duralım ve yavaş yavaş sırayla gidelim. C++ programını da bir kenara bırakalım lütfen. D programını anlamada kafamızı karıştırmaktan başka hiçbir işe yaramıyor. (Hatta, C++ kaynak kodunun UTF-8 olabilmesi ise sanırım ancak C++11 ile mümkün oldu.)
-
D'de char dizgileri UTF-8'dir. Bundan kaçış yok. Dolayısıyla, "ü" dizgisi iki adet UTF-8 baytından oluşur.
-
O baytlar çıkışa yazdırıldıklarında doğal olarak iki adet UTF-8 kodu olarak yazdırılırlar.
-
Çıkışta konsol var. Konsol eline teker teker iki bayt geçirir. O baytları ne yapsındır? Eğer 1254'e veya başka bir karakter tablosuna ayarlanmışsa her birisini tek karakter olarak algılar ve iki adet karakter yazdırır. ü'nün UTF-8'deki iki baytının değeri 1254'te hangi karakterlere karşılık geldiyse konsol onları gösterir.
Dolayısıyla, konsolu UTF-8'e ayarlamazsak D programının doğru göstermesi mümkün değildir. (Aslında dizgiyi yazdırmadan önce kendimiz bir tercüme de yapabiliriz: Örneğin, ü yerine 1254'teki karşılığını yazdırabiliriz ama her write'tan önce buna dikkat etmek gerekeceğinden onu bir kenara bırakalım.)
- Konsol UTF-8 olsa bile kullanılan fontun da Unicode karakterlerini içermesi gerekir. Bunun iki yolu olmalı:
Birincisini denedik ve başaramadık: Fontu program içinden seçmek.
İkinci yöntem, konsol için seçilen fontu sistem düzeyinde değiştirmek. Bir anlamda, varsayılan fontu bir kere seçmek. Bu, programın herhangi bir Windows ortamında işlediği durumu kurtarmıyor ama bizim için bir çözüm olabilir.
Benim anladığım bu. Tabii bunun tersi de gerekiyor:
-
Klavyenin fiziksel olarak sağ taraflarındaki o tuşun ü olduğu seçilmiş olan klavye düzeninden bilinmektedir.
-
Konsol ü'ye basıldığını öylece anladığı için onun karşılığı olan iki UTF-8 baytını programın girişine verir.
-
D programı da UTF-8 olduğundan iki baytı olduğu gibi alır ve char dizisinin içine yerleştirir.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]