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