Bu site emekli olmuştur. Arşiv amaçlı olarak
BT AKADEMİ
sponsorluğunda yayın hayatına devam etmektedir.
Ana Sayfa
.net TV
Makaleler
Kaynak Kod
Haberler
Serbest Köşe
Canlı Köşe
Forum
C#nedir?
Ekibimiz
RSS
ADO.NET/SQL
C / Sys Prog.
Genel
Mono ve .NET
Silverlight
XML / Web Serv.
X86 Assembly
C++ / C++.NET
J#.NET / Java
.NET 3.x
UML / Analiz
Yazılım Müh.
ASP.NET
C# / VC#/.NET
Mobil Prog.
PHP 5
YAZAR HAKKINDA
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ı
:
33042
Yorum Sayısı
:
0
yorum yaz
SİTE İÇİ ARAMA
Ü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.
C#nedir? hesabınız yok mu?
Üye olabilmek için
tıklayın
.
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.
Silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
silindi
emre TAŞ
yazının devamı >
Bende Yazmak İstiyorum
Blogroll
Burak Selim Şenyurt
Bellek Yönetiminde Verimlilik için İpuçları (Rust Odaklı)
18.5.2025
Burak Selim Şenyurt
Rust ve Güvenli Bellek Yönetimi Hakkında
18.5.2025
Diğer Herşey
»
Makaleler RSS
»
Video Gönder
»
Makale Gönder
»
Serbest Köşeye Yazı Gönder
»
Yazar Başvurusu
»
C#nedir? Ekibinde Olmalıyım!
Sponsorlar
Ana Sayfa
/
Makaleler
/
C# / VC#/.NET
/
String İçinde Unicode İşlemleri
String İçinde Unicode İşlemleri
Favorilerime Ekle
Gönderiliyor lütfen bekleyin...
arkadaşıma gönder
Arkadaşınızın email adresi:
*
Mesajınız:
// 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:
Unicode’ lar karakter şekline dönüştüğünde okunabilir şekilde olması için Fontumuzu Unicode tipte bir font olarak ayarlamamız gereklidir. Mesela burada sistemin fontlarıyla oynamak yerine kullandığımız listBox’ ın font name özelliğini
Lucida Sans Unicode
yaparak bu özel karakterlerin görülmelerini sağladık.
Localization (Yerelleştirme) - 1
,
Localization (Yerelleştirme) - 2
,
Metin(String) İşlemlerinde Performansı Artırmak,
ASP.NET Uygulamalarında Performansı Artırmak
isimli sitemizdeki makaleleri okumanızı tavsiye ederim.
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
Dizayn ve Kodlama
bt
akademi
. Tüm Hakları Saklıdır © Copyright 2002-2009 c#nedir?com
Makaleler
Serbest Köşe
Makale Gönder
.Net TV
Video Gönder
Canlı Köşe
Kaynak Kod
Forum
Haberler
Röportajlar
Anketler
C# Nedir?
İletişim
Site Haritası
RSS
Favorilere Ekle
Üyelik
Hesap Aktivasyon
Ekibimiz
Ekibe Katıl