|  | 
        
            | 
                    
                        | String İçinde Unicode İşlemleri |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            | // Makaleye başlamadan önce yazının sonundaki 
uyarılar ve tavsiyeler bölümünü okumanızı tavsiye ederim. 
 .NET’ te yazılım geliştirirken en çok 
kullandığımız veri türlerinden birsi önceden tanımlı referans türlerinden birisi 
olan string tipidir. Şahsi 
fikrime göre .NET’ in string işlemlerinde bu kadar gelişmiş olması bu kadar fazla 
kullanılmasına olanak sağlamıştır. Bunun tarihsel bir örneği de COBOL programlama 
dilinde görülmektedir. String işlemlerini en  iyi yapan programlama 
dilinin şu an için C# olduğunu söyleyebiliriz. String veri tipinin bize sağladığı birçok 
özellik bulunmaktadır. Bunları hatırlamanın hepimiz için faydalı olacağı 
düşüncesindeyim. Aşağıdaki 
tabloda string türünün işimize yarayacak özellikleri verilmiştir.
 
 
 
	String’ in genel özelliklerini hatırladıktan 
sonra konumuza gelelim. System.Char isim uzayı gerçekte en fazla 
kullanılan Unicode’ ların değerlerine göre tasarlanmıştır. Bu kod sistemi 
16-bitlik bir kod sistemidir ve gereksiz olan kod değerleri çıkarılarak 
yapılmıştır yani bir özet diyebiliriz. Örneğin bazı dillerin içlerinde bulunan 
özel karakterler bu Unicode sistemi içinde özetlenirken çift değer alarak 
özetleme işlemine gidilmiştir. Bu birleştirmelere örnek verirsek; Arapçadaki 
elif harfi (kodu U+0625) ve kasra harfi (kodu U+0650) tek bir özet karakter 
olarak birleştirilmiştir.
		| Üye | Üye’nin görevi |  
		| Length | string içinde kaç karakter 
		olduğunu döner. |  
		| Chars | istenen index’ teki 
		karakteri döner. |  
		| GetEnumerator | bir IEnumerator geri döner 
		ve bu string’ in bütün karakterlerini itere etmemizi sağlar |  
		| ToCharArray | char
		[] dizisi geriye döner. |  
		| IndexOf/LastIndexOf | verilen değeri string 
		içinde arar ve bulduğu sonucu baştan/veya sondan sayarak ilk başladığı 
		index’ i int tipinden bir değer olarak döner. |  
		| IndexOfAny/LastIndexOfAny | özel karakterlerin 
		dizisini alarak string içinde arar ve bulduğu noktayı(baştan/sondan)
		int olarak geri döner. |  
 Bunlara ek olarak bazı özel karakterlerin  
Unicode değerleri 16-biti aşabilmektedir. Bu karakterler iki tane 16 bitlik 
Unicode kullanılarak uygulanır. Aslında bu işlemin nasıl olduğunu assembly ile 
uğraştıysanız daha rahat anlarsınız. Çünkü iki tane 16 bitlik alan alarak bu 
gerekli olan Unicode binary formatta bu alanlara işler, eğer 32 bitlik alanın 
tamamı 
dolmaz ise padding denilen işlemi gerçekleştirir ve boş yerler 0 değerini alır. 
İki tane 16 bitlik alandan bahsettik. Bunlardan ilk 16 bitlik alan "high 
surrogate" olarak ,ikinci 16 bitlik alan ise "low surrogate" olarak 
isimlendirilir. High surrogate bölgenin alabileceği değerler U+D800 - 
U+DFF arasında değişir. Low surrogate bölgenin alacağı değerler ise U+DC00 - 
U+DFFF arasında değişir. Böyle bir mantık kullanılması .NET ile milyonlarca 
karakterin sorunsuz bir şekilde kullanılabileceği anlamına gelmektedir.
 
 Surrogate karakterler dediğimiz özel 
karakterler U.S.A ve Avrupa’ da nadiren kullanılmasına karşın Ortadoğu ve Asya’ da bol 
miktarda kullanılmaktadır. Çok uzağa gitmemize gerek yok aslında. Alfabemizdeki 
Ğ,Ş,Ö.. gibi harfler bu grup dahilindedir. Bu tarz karakterin sorunlarını 
System.Globalization isim uzayındaki çeşitli sınıfları kullanarak çözeceğiz. Bir 
string içerisindeki Unicode’ leri alıp anlaşılır bir string’ e çeviren 
System.Globalization.TextElementEnumerator  isim 
uzayından yararlanacağız.
 
 Bunlara alternatif olarak StringInfo 
sınıfının ParseCombiningCharacters methodu yardımı ile bir Int32 dizi sağlarız. Bu dizinin uzunluğu bize 
string içinde kaç tane Unicode bulunduğunu 
verir. Bu dizinin her bir elemanın indeksi bize bulunan Unicode’ ün string içinde 
kaçıncı indeksten başladığını verir. Öncelikle string verimiz içinde Unicode kodunu 
vererek bunun nasıl okunabilir karakterlere dönüştüğünü inceleyelim. Aşağıdaki 
UniCodeToText() metodumuz bu işlemi gerçekleştiriyor.
 
 
 
	StringInfo, System.Globalization.StringInfo isim uzayının bir sınıfıdır. Verilen string’ in 
özelliklerini TextElementEnumerator nesnesine geri gönderir. Burada şöyle bir 
benzetme yapabiliriz. Zeytinyağı yapmadan önce zeytinler içindeki 
pislikler, yapraklar vb. şeyler temizlenir. İşte burda StringInfo sınıfı zeytin 
yağ sıkılacak kıvama getiriyor. Daha sonra TextElementEnumerator sınıfı ise 
işlenmiş string’ i alarak gerekli çeviriyi yapıyor. Yani TextElementEnumerator
temiz zeytinin yağını sıkıyor. Zeytinin yağını sıkarken birde asit derecesi 
önemlidir. Yani asit değerleri hangi değerde başladı, bitti gibi değerleri için 
kullandığımız UnicodeIndexer fonksiyonumuza bakalım;
		| public void UnicodeToText(string s) {
 
 StringBuilder sb=new StringBuilder();
 TextElementEnumerator 
		chardonusturur=StringInfo.GetTextElementEnumerator(s);
 while(chardonusutur.MoveNext())
 {
 sb.AppendFormat(chardonusturur.GetTextElement());
 }
 listBox1.Items.Add(sb.ToString());
 }
 |  
 
 
	Bu fonkisyonda dikkat çeken 
StringInfo.ParseCombiningCharacters isimli geriye int bir dizi dönen 
fonksiyondur. Örneğimizle özdeşleştirirsek bu fonksiyon zeytin yağının asitlik 
değerlerini ölçer ve geriye değerler verir. Genel olarak dünyada çok çeşitli kullanılmakta 
olan Unicode’ lar bulunmaktadır. Bu Unicode’ lar ile ilgili bir çok site 
bulabilirsiniz. Benim yaralandığım bir Unicode sitesi
bu linkten 
ulaşabilirsiniz.
		| public void UnicodeIndexer(string s) {
 StringBuilder sb=new StringBuilder();
 Int32 [] indexler=StringInfo.ParseCombiningCharacters(s);
 for(Int32 i=0;i<indexler.Length;i++)
 {
 sb.AppendFormat("indexler[{0}]={1}{2}",i,indexler[i],Environment.NewLine);
 }
 MessageBox.Show(sb.ToString());
 }
 |  
 Örneğin birçok Avrupa dilinde harflerin 
üstlerine şapkalar yaparak o hecelerin vurgulanması sağlanır. Bizde bizim şu bir 
zamanlar kullandığımız namı diğer şapkalı a’ mızı ve c harfinin altına "," 
koyarak nasıl "ç" harfi oluşturacağımıza bakalım. A harfine şapka koyacak olan 
Unicode karakterimiz \u0304’dür. Bu Unicode’ ün önünde koyduğunuz 
harfin(a\u0304=şapkalı a) tepesine şapka koyar. Aynı şekilde tepeye koyduğumuz 
şeyi aşağıda koyabiliriz. Bunu yapan özel Unicode değerimiz ise \u0327 dır. Bu 
değerin önüne c koyarak "ç" elde ederiz. Aşağıdaki kodları dikkatlice inceleyerek 
sistemi daha iyi kavrayabiliriz.
 
 
 
	Programımızı çalıştırdıktan sonraki görünüm ise 
gerçekten .NET’ in global gücünü bir kez daha gözler önüne seriyor.
		| private void 
		button1_Click(object sender, System.EventArgs e) {
 string s="a\u0304bc\u0327"; 
		// bu satırda stringe unicode verildi
 label1.Text=@"a\u0304\u0308bc\u0327";
 UnicodeToText(s);
 UnicodeIndexer(s);
 }
 public void UnicodeToText(string s) // unicodeları ayıran method
 {
 StringBuilder sb=new StringBuilder();
 TextElementEnumerator 
		chardonusutur=StringInfo.GetTextElementEnumerator(s);
 while(chardonusutur.MoveNext())
 {
 sb.AppendFormat(chardonusutur.GetTextElement());// 
		kırmızı ile çizili fonksiyon unicodun char karşılığını alır
 }
 listBox1.Items.Add(sb.ToString());
 }
 public void UnicodeIndexer(string s) // unicodeların nerde başladığını 
		gösteren method
 {
 StringBuilder sb=new StringBuilder();
 Int32 [] indexler=StringInfo.ParseCombiningCharacters(s);
 for(Int32 i=0;i<indexler.Length;i++)
 {
 sb.AppendFormat("indexler[{0}]={1}{2}",i,indexler[i],Environment.NewLine);
 }
 MessageBox.Show(sb.ToString());
 }
 |  
 
  
 Uyarılarlar ve 
Tavsiyeler:
 
 
 
                Makale:String İçinde Unicode İşlemleri C#, Visual C# ve .NET Caner Şahan
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |