Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Caner Şahan
Caner Şahan
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
24 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: alarak bitlik degerleri geriye karakter karakterler kullandigimiz oldugunu sb=new sistemi string string’ stringbuilder unicode unicode’ C# / VC#/.NET Caner Şahan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 1.4.2005
Okunma Sayısı : 30850
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 21.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
String İçinde Unicode İşlemleri
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
// 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.

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

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.

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());
}
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 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());                                                                                             
}
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.

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

 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());
  }
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.



Uyarılarlar ve Tavsiyeler:

Makale:
String İçinde Unicode İşlemleri C#, Visual C# ve .NET Caner Şahan
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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