BilgeAdam‘da bir öğrencimin sorusu üzerine, bir dosyanın UTF8 formatında olup olmadığını belirlemek için programatik yollar düşünmeye başlamıştım.
System.Text namespace’inde bulunan Encoding class‘ını incelerken şöyle bir yol buldum;
public static bool IsUtf8(string DosyaAdi)
{
using (var Dosya = File.Open(DosyaAdi, FileMode.Open))
{
byte[] pre = Encoding.UTF8.GetPreamble();
var b = new byte[pre.Length];
Dosya.Read(b, 0, b.Length);
return b.SequenceEqual(pre);
}
}
Sadece dosyanın UTF8 olduğunu kontrol etmek için biraz hantal bir yol gibi gözüküyor değil mi?
Daha iyi bir yöntem öneriniz varsa, yorumlarınızı bekliyorum.
C#, Programlama
csharp, dosya formatı, encoding, file format, file.open, filemode, getpreamble, read, sequenceequal, system.text, utf8
Hangi .Net yazılımcısına sorsanız, string tipinde değişkenin hafızada kapladığı yeri hesaplamak için, karakter sayısını 2 ile çarpmak gerektiğini söyler (UTF-8 kodlama).
Genel olarak kabul gören bu hesaplama yöntemi, birçok durumda gerçeğe çok yakın sonuç üretir. Fakat sonuç tam olarak doğru değildir.
UTF-8 (Unicode Transformation Format) hakkında daha fazla bilgiyi Wikipedia‘da yeralan şu makale‘den edinebilirsiniz.
Peki string değişkenin hafızada kapladığı alanı tam olarak nasıl hesaplayacağız?
string OrnekString = "ἄλφα βῆτα γάμμα δέλτα deneme test";
MessageBox.Show("Uzunluk * 2: " + OrnekString.Length * 2 + " Byte");
MessageBox.Show("Gerçek uzunluk: " + Encoding.UTF8.GetByteCount(OrnekString).ToString() + " Byte");
OrnekString.Length * 2: 66 Byte değerini üretirken,
Encoding.UTF8.GetByteCount(OrnekString): 53 Byte değerini üretmiştir.
String değişkenlerin hafızada kapladığı alanı tam olarak hesaplamanız gerektiği durumlarda, Encoding.UTF8.GetByteCount() fonksiyonunu kullanmanızı öneririm.