yazılım,c# ve domates kabuğu
« Sahte Bulutlarbeklenen linq tepkisi »

Invariant Case Türkçe İ ve I karakterleri

  12/01/12 22:19, by ertan, Categories: Algoritma Soruları

Ç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.

Back To Basics

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.

Problem nerde ?

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.

Nasıl ?

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

İşin özeti

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.

No feedback yet

Leave a comment


Your email address will not be revealed on this site.
  
(For my next comment on this site)
(Allow users to contact me through a message form -- Your email will not be revealed!)
Text Renderers:
 

©2017 by Ertan Tike

Contact | Help | Blog template by Asevo | blog engine | cheap hosting