Forum: Ders Arası RSS
D.ershane Eşleme Tabloları
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D.ershane Eşleme Tabloları
import std.stdio;
import std.string;
 
void main()
{
    string[string] renkler = [ "siyah"   : "black",
                               "beyaz"   : "white",
                               "kırmızı" : "red",
                               "yeşil"   : "green",
                               "mavi"    : "blue",
                               ];
 
    writeln("Ben bu ", renkler.length,
            " rengin İngilizcelerini öğrendim: ",
            renkler.keys);
 
    write("Haydi sorun: ");
    string türkçesi = chomp(readln());
 
    if (türkçesi in renkler) {
        writefln("İngilizcesi \"%s\"", renkler[türkçesi]);
 
    } else {
        writeln("Onu bilmiyorum.");
    }
}
Sanırım renklerin ingilizceleri soran program istediğimiz gibi çalışmıyor. Şöyle ki Türkçe karakter içeren bir renk girdiğimizde bilmiyorum diyor.

Ben bu 5 rengin İngilizcelerini öğrendim: ["yeşil", "beyaz", "kırmızı", "siyah", "mavi"]
Haydi sorun: yeşil
Onu bilmiyorum.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Önceki mesajlarında konsolunun UTF-8 olmadığından şüphelenmiştim. Programı şöyle değiştirip dizgi içinde hangi kodlar bulunduğuna bakar mısın:

// ...
    string türkçesi = chomp(readln());
    foreach (ubyte kod; türkçesi) {
        writefln("%08b (%s)", kod, kod);
    }
// ... 

Bendeki çıktısı şöyle:

Ben bu 5 rengin İngilizcelerini öğrendim: ["yeşil", "kırmızı", "beyaz", "siyah", "mavi"]
Haydi sorun: yeşil
01111001 (121)
01100101 (101)
11000101 (197)
10011111 (159)
01101001 (105)
01101100 (108)
İngilizcesi "green"


UTF-8 kodlamasına göre ilk biti 0 olan karakterler ASCII'deki ile aynı oluyorlar. 11 ile başlayanlar iki bayttan oluşan bir Unicode karakterinin ilk kodu oluyor ve 10 ile başlayan da son kodu oluyor (yukarıdaki ikisi ş'yi temsil ediyorlar).

Benim anladığım bu... (?) Senin çıktınla benimki arasında başka bir fark daha var: eşleme tablosunun elemanları farklı sıradalar. Bunun nedenini anladım: 64 bite ile 32 bit derleme arasında farklı oluyormuş. Bizim için önemli olmamalı...

Ali
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hımm maalesef Türkçe karakterler olan renkleri tanımadığı için dizgi kodlarını yazdıramadım. Ama örneğin beyaz için çıktı şu şekilde:

Ben bu 5 rengin İngilizcelerini öğrendim: ["yeşil", "beyaz", "kırmızı", "siyah", "mavi"]
Haydi sorun: beyaz
01100010 (98)
01100101 (101)
01111001 (121)
01100001 (97)
01111010 (122)
İngilizcesi "white"

C:\Users\Erdem\Desktop\dcalisma>test
Ben bu 5 rengin İngilizcelerini öğrendim: ["yeşil", "beyaz", "kırmızı", "siyah", "mavi"]
Haydi sorun: mavi
01101101 (109)
01100001 (97)
01110110 (118)
01101001 (105)
İngilizcesi "blue"

Windows ülkesinde UTF8'in ikinci sınıf vatandaş olduğu söyleniyor. Sanırım stackoverflow'da okumuştum  :-)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
Türkçe karakterler olan renkleri tanımadığı için dizgi kodlarını yazdıramadım.

Peki ne oluyor? Program yeni eklediğimiz foreach satırına geliyor helhalde, değil mi? O satıra geldiğinde 'türkçesi' değişkenini boş olarak mı görüyorsun? Değilse içinde kodların yazdırılması gerek. (?)

Bir de chomp'tan şüphelenelim bakalım. readln()'ı bir ara değişken olarak okuyup onun da kodlarını yazdırır mısın?

Ali
Kadir Can #5
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben de bir yerde Windows'un UTF8 karakterleri doğruokuduğunu, ancak ekrana yazarken sıkıntı çıkardığını okumuştum.
chomp() kullanmayınca düzgün çalışıyor.
Bu mesaj Kadir Can tarafından değiştirildi; zaman: 2012-07-18, 14:03.
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
acehreli:
erdem:
Türkçe karakterler olan renkleri tanımadığı için dizgi kodlarını yazdıramadım.

Peki ne oluyor? Program yeni eklediğimiz foreach satırına geliyor helhalde, değil mi? O satıra geldiğinde 'türkçesi' değişkenini boş olarak mı görüyorsun? Değilse içinde kodların yazdırılması gerek. (?)

Hiç kod sayfasını değiştirmezsek şu şekilde oluyor.

Ben bu 5 rengin ─░ngilizcelerini ├Â─şrendim: ["ye┼şil", "beyaz", "k─▒rm─▒z─▒", "
siyah", "mavi"]
Haydi sorun: yeşil
yeşil
01111001 (121)
01100101 (101)
10011111 (159)
01101001 (105)
01101100 (108)
Onu bilmiyorum.

Ama kod sayfasını chcp ile UTF-8 kullanacak şekilde değiştirdiğimizde türkçesi değişkeninin boş olduğunu görüyoruz.

>chcp 65001
Etkin kod sayfası: 65001

dcalisma>test
Ben bu 5 rengin İngilizcelerini öğrendim: ["yeşil", "beyaz", "kırmızı", "siyah",
 "mavi"]
Haydi sorun: yeşil

Onu bilmiyorum.

acehreli:
Bir de chomp'tan şüphelenelim bakalım. readln()'ı bir ara değişken olarak okuyup onun da kodlarını yazdırır mısın?

Ali bey bu dediğinizi tam anlamadım. Ama Kadir Can'ın dediği gibi chomp()'u kaldırıp denedim. O şekilde de ekrana gene boş yazıyor.
Kadir Can #7
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kod sayfasını değiştirince UTF8 karakterler doğru yazılıyor; ama okumada sıkıntı oluyor.
Erdem; bir de kod sayfası değiştirmeden ve chomp() kullanmadan dener misin?
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Denedim ama bu sefer türkçesi değişkeni yeşil olarak gözüküyor. Ama tabi  ye┼şil gibi bir değer olduğu için program gene doğru çalışmıyor. Bir de örneğin benim yazdığım kaynak kod da UTF-8 kodlaması kullanıyor. Acaba ondan kaynaklanıyor olabilir mi diye bir düşünce geldi.

Kişisel düşüncem artık Digital Mars bu kodlama olayını çözmeli. Anladığım kadarıyla Windows'un konsolu ISO-8859-9 ya da Windows-1254 kodlamasını kullanıyor. Örneğin C# ya da Borland C ile bir kod yazdığınızda konsolda karakterler doğru olarak gösteriliyor.

Bu gün hatta Github'a da kullandıkları kod renklendirmesi eklentisinin Türkçe karakterleri hata kodu olarak gördüğünü ve kırmızı olarak gösterdiğini, mümkünse düzeltmelerini rica ettim  :-)
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdi araştırınca Windows'un Unicode desteği konusunda çok hataları olduğu ile ilgili bilgiler görüyorum (en azından konsolda).

erdem:
Digital Mars bu kodlama olayını çözmeli.

Geleneksel olarak programların giriş ve çıkış akımları char temelli olduğundan UTF-8 çok uygun bir kodlama. Üstelik ASCII char dizileri de otomatik olarak UTF-8 kodlaması oluyor.

O açıdan Digital Mars'ın seçimi en doğrusu. Yalnızca extended ASCII yapsalar yalnızca 256 harf destekleyebilirlerdi. wchar veya dchar seçseler bu sefer endianness sorunları olurdu.

Anladığım kadarıyla Windows'un konsolu ISO-8859-9 ya da Windows-1254 kodlamasını kullanıyor. Örneğin C# ya da Borland C ile bir kod yazdığınızda konsolda karakterler doğru olarak gösteriliyor.

Çünkü onlar Unicode'u desteklemiyorlar, değil mi? O programlar içindeki "yeşil"i Türkiye'deki bir Windows konsolunda doğru görüyorsak başka bir ülkedeki konsolda farklı görürüz.

Unicode bu gibi sorunları ortadan kaldırıyor ama Windows'un da desteklemesi gerek...

düzeltmelerini rica ettim  :-)

Teşekkür! :)

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 13:07:33 (UTC -08:00)