Pages: 1 2 3 4 5 6 7 8 9 10 11 ... 44 >>
Çin takvimine göre ejderha yılına girmiş bulunuyoruz. Bu yıl bol bol ejderha çizmeye ve boyama konusundaki çaylaklığımı gidermeye niyetliyim. Suluboyayla başlıyorum.
Here is my first watercolor ugly dragon ![]()
Çok eski bir konu ama halen bu konuda hatalı kodlarla karşılaştığım için anlatayım. .Net Framework 2.0 versiyonu ile string karşılaştırmalarda yeni bir özellik geldi.
Geçmiş ile işim olmaz diyenler bu bölümü atlayabilir, meraklılar için önce biraz zamanda geri saralım.
Bundan 15 yıl öncesinde DOS tipi işletim sistemleri kullanılırken dillerdeki farklı karakterleri göstermek için ISO 8859 adında bir standart kullanılmaya başlandı. O tarihlerde bilgisayarlar daktilo niyetine kullanıldığı için temel olarak ingilizce'yi alan bu standart farklı diller içinde 255 karakter içerisinden sık kullanılmayan karakterlerin şekilleri ve karakterlerin sıralaması değiştirilerek çözüldü.
Örneğin; Türkçe için Ş,İ,Ö,Ç gibi karakterlere değiştirerek Latin-5 (Tam ismiyle ISO-8859-9) isimli ISO standardı uyduruldu.
Eğer farklı bir dil setini kullanıyorsanız "I" harfi ile "ı" (yada ekranda göreceğiniz şekliyle "Y" benzeri bir şey) aynı anlamda değildi.
O zamanları hatırlayınca Türkçe karakter problemleri şimdi yaşananlar bunca karmaşaya rağmen çok hafif kalır aslında ama neyse.
1990'ların sonuna doğru tüm bu sorunları ortadan kaldırmak için Unicode adı verilen yeni bir standart yayılmaya başladı ama ancak şimdilerde yaygın olarak kullanılmaya başladı. .Net'in ilk yayınladığı 1.0 versiyonunda da varsayılan olarak Unicode kullanılması belki de tüm bunlara bir katkısı olmuştur.
Framework 1.0'daki tüm string işlemlerinin kullanılan dilin özelliklerine göre çalışması bir sürü karakter sorunlarını çözdü ama bu sefer farklı bir problem yarattı.
Örneğin; Diskinizdeki C:\Inceden.txt isimli bir dosyayı açmak niyetiyle aşağıdaki gibi bir iş yaparsanız
Code:
string dosya = "C:\Inceden.txt"; | |
| |
File.Open( dosya.ToLower() ); |
Dosyanın adı "c:\ınceden.txt" gibi bir şeye dönüşüyor, normal olarakta dosyayı bulamıyordunuz.
Aslında bu normal çünkü Türkçe size "I" harfinin küçülmüş halinin "ı" olduğunu söyler.
Bu sefer karşılaştırma işlemlerinde üzerinde işlem yapmak istediğiniz şeyin ne olduğu bu sefer değişmeye başladı. Bu bir kişinin adı mı ?, yoksa dosya adı mı ? gibi.
1.1 versiyonuna kadar devam eden problem benimde katkımla yoğun şikayetler yüzünden framework'deki string işlemlerine Invariant ve Ordinal isimli yeni karşılaştırma tipleri eklenerek çözüldü. Bu konuyla ile ilgili daha fazla detayı buradan öğrenebilirsiniz.
Eğer kullanılan dilden bağımsız hareket etmek istiyorsanız Invariant, dil ile ilgisiz tam eşleşme istiyorsanız Ordinal kullanılması gibi bir çözüm çıktı.
Örnekle gidelim;
Biraz önceki dosya adını invariant kullanarak küçük harflere çevirirsek;
Code:
? "Inceden.TXT".ToLowerInvariant() | |
"inceden.txt" |
Örneğin Invariant karşılaştırırsak;
Code:
? string.Equals("i","I", StringComparison.InvariantCultureIgnoreCase) | |
true | |
? string.Equals("ş","S", StringComparison.InvariantCultureIgnoreCase) | |
false | |
? string.Equals("ş","Ş", StringComparison.InvariantCultureIgnoreCase) | |
true |
benzeri ordinal karşılaştırma yaparsak;
Code:
? string.Equals("i","İ", StringComparison.OrdinalIgnoreCase) | |
false | |
? string.Equals("I","İ", StringComparison.OrdinalIgnoreCase) | |
false | |
? string.Equals("i","I", StringComparison.OrdinalIgnoreCase) | |
true |
ordinalin farklı davrandığı bir örnek olarak
Code:
? string.Equals("a","A", StringComparison.OrdinalIgnoreCase) | |
true |
Herhangi bir string karşılaştırma yapacaksanız, string içindeki değerin ne olduğunu bilerek davranmanız ilerde daha az ağrısız bir ortam yaratır size.
Size tavsiyem hiç bu özellikleri kullanmadan asla ama asla myString1 == myString2 şeklinde bir karşılaştırma yapmayın. Bu tür karşılaştırmalar işletim sisteminin seçtiği dilin özelliklerine göre çalışır, eğer yazdığınız uygulama birden fazla dil desteği sağlıyorsa uzak durun derim.