D.ershane D Programlama Dili Dersleri

akım: [stream], nesnelerin art arda erişildiği giriş çıkış birimi
bayt sırası: [endianness], veriyi oluşturan baytların bellekte sıralanma düzeni
BOM: [BOM, byte order mark], dosyanın en başına yazılan Unicode kodlama belirteci
kurma: [construct], yapı veya sınıf nesnesini kullanılabilir duruma getirmek
Phobos: [Phobos], D dilinin standart kütüphanesi
... bütün sözlük

Bölümler
İngilizce Kaynaklar
Diğer



Dosyalarla Unicode

Dosyalar dersinde gördüğünüz File olanaklarının ancak BOM'suz UTF-8 dosyalarla ilgilenebildiklerini görmüştünüz. Bu bölümde, başka programlar tarafından doğru olarak açılabilecek Unicode dosyalar oluşturmayı, ve başka programlar tarafından yazılmış Unicode dosyaları okumayı öğreneceksiniz.

Metin dosyaları

Bu bölümde yalnızca metin dosyaları ile ilgileneceğiz. Metin dosyaları, içlerinde yalnızca harfler ve kontrol karakterleri bulunduran dosyalardır.

Unicode karakterlerden oluşan dosyalar da metin dosyası olarak kabul edilirler, ancak bu dosyalardan veri okumaya geçmeden önce başlarında bulunan BOM belirteçlerinin okunmaları gerekir.

Her ne kadar genelde metin hazırlamak için kullanılıyor olsalar da, Microsoft Word veya OpenOffice Writer gibi programların ürettikleri dosyalar, bu dersin örnekleri açısından metin dosyası olarak kabul edilmezler. O dosyaların özel düzenleriyle ilgili olarak içerdikleri karakterler harf olarak algılanabilirler ve yanlış okunabilirler.

std.stream.EndianStream akımı

Eğer oluşturmak veya okumak istediğiniz metin dosyası BOM belirteci içeriyorsa, EndianStream olanağından yararlanmanız işinizi oldukça kolaylaştırır.

BOM (byte order mark): Bir dosyanın çeşitli Unicode kodlamalarından hangisi ile yazıldığı bilgisi, dosyanın en başına yazılan bir kaç özel karakterle belirlenir. Bu karakterlere "bayt sırası işareti" anlamına gelen "byte order mark" denir. BOM temelde iki bilgi taşır:

BOM içeren dosyaları kullanmak için yapmanız gereken, dosyayı bir std.stream.File olarak açmak ve bu nesneyi kullanarak bir EndianStream kurmaktır:

    auto asılDosya = new File("ogrenci_bilgisi", FileMode.In);
    auto dosya = new EndianStream(asılDosya);

Dosya işlemleri artık bu yeni nesne ile yapılır; asılDosya olarak adlandırılan File nesnesi, kurulması dışında başka bir işe yaramaz. Bir daha kullanılmayacak olan bu nesneyi isim vererek kurmak yerine EndianStream'e isimsiz olarak da verebiliriz:

    auto dosya = new EndianStream(new File("ogrenci_bilgisi",
                                           FileMode.In));

Böylece hem kod daha kısa olur, hem de doğrudan kullanılmaması gereken bir nesneyi yanlışlıkla kullanma riski ortadan kalkmış olur.

std.stream.EndianStream ile yazma örneği
import std.stream;
import std.system;

void main()
{
    auto dosya =
        new EndianStream(new File("ogrenci_bilgisi", // 1 ve 2
                                  FileMode.OutNew));
    dosya.writeBOM(BOM.UTF8);                        // 3

    dosya.writefln("İsim  : ", "Zafer");             // 4
    dosya.writefln("Numara: ", 123);
    dosya.writefln("Sınıf : ", "1A");
}
  1. Asıl dosya yukarıda anlatıldığı şekilde kurulur
  2. Asıl dosya kullanılarak bir EndianStream nesnesi kurulur
  3. İsteğe bağlı olarak dosyaya BOM belirteci yazılır (BOM.UTF8'in tanımı std.system modülündedir); çoğu program dosyanın içeriğini doğru tahmin ediyor olsa da, yine de en iyisi BOM'u da yazmaktır
  4. Dosya işlemleri yeni kurulan EndianStream nesnesi ile yapılır

Bu programın oluşturduğu dosyayı daha önce öğrendiğiniz File'lardan ikisi de doğru olarak okuyamaz. Onlar writeBOM() işlevinin dosyanın başına yazdığı belirteci de metin karakteri olarak okumaya çalışırlar:

Okuduğum satır -> |▯İsim  : Zafer  ← İ'den önce bozuk
Okuduğum satır -> |Numara: 123       karakter
Okuduğum satır -> |Sınıf : 1A

İşte bu yüzden, BOM'lu dosyaları da EndianStream ile okumak gerekir.

std.stream.EndianStream ile okuma örneği

Dosyadaki bilgileri okumaya başlamadan önce BOM'un okunması ve gözardı edilmesi gerekir. BOM'u okuyan readBOM() işlevi, ayrıca akımı da dosyanın kodlaması konusunda bilgilendirir.

import std.cstream;
import std.stream;

void main()
{
    auto dosya = new EndianStream(new File("ogrenci_bilgisi",
                                           FileMode.In));

    dosya.readBOM();      // ← BOM'un okunup gözardı edilmesi

    while (dosya.available) {
        char[] satır = dosya.readLine();
        dout.writefln("Okuduğum satır -> |", satır);
    }
}
Diğer kodlama çeşitleri

Phobos; UTF8, UTF16LE, UTF16BE, UTF32LE, ve UTF32BE BOM belirteçlerini destekler.