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:
- Dosyanın hangi Unicode kodlamasını kullandığı (UTF-8, UTF-16, vs.)
- Her karakterin kodlarının hangi sırada yazıldığı (örneğin 'Ğ'nin 16 bitlik kodlamadaki iki baytının değeri
1 30veya30 1sırasıyla yazılmış olabilir)
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"); }
- Asıl dosya yukarıda anlatıldığı şekilde kurulur
- Asıl dosya kullanılarak bir
EndianStreamnesnesi kurulur - İsteğe bağlı olarak dosyaya BOM belirteci yazılır (
BOM.UTF8'in tanımıstd.systemmodü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 - Dosya işlemleri yeni kurulan
EndianStreamnesnesi 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.
D.ershane
Forum
Wiki
Projeler
Tanıtım
İletişim
Hakları