Thursday, August 31, 2006

ASP.NET; Türkçe sorunu (Unicode problem)



(English)
If you have an unicode problem in your ASP.NET project. Please see below.

Hemen ilk ASP.NET'e başlayanlar bilirler, Türkçe karakterlerde sorunlar çıkıyor. Aslında sadece Türkçe değil, diğer dillerde de sorunlar çıkıyordur. Ben hep bilnen yöntemleri yaptığım halde bazen istemediğimiz sonuçlar çıktığını gördüm.

Şöyleki, eğer sadece Türkçe bir site yapıyorsanız, web.config dosyasını bilinen şekilde düzeltmeniz yeterli olmaktadır. Ancak bir çok dili destekleyecek bir site yapmak istediğinizde, işler karmaşıklaşıyor.

Ben burada şunun için şu kodu bunun için bu kodu yazın demiyeceğim. Çok yakın bir zamanda farkettiğim ve gerçekten GEYİK bir sebepten ötürü Unicode karakterlerin görünmeme sorunun çözümünü anlatacağım. Bu sorunun tespitinde yıllar önce Unix sistemde bir Perl scripti yazarken karşılaşmıştım:

Hazır bir mail gönderme scripti ile kendi yazdığım bir kaç kodu ilave ederek bir form gönderme olayı yapmak istiyordum. Kodları güzelce yazıyorum, ama bir türlü çalışmıyordu. Merhaba dünya gibi basit bir kodu bile çalıştıramadığımı görmüştüm. Sonra şunu farkettim, ben NOTEPAD ile yazıp Unix'e upload ettiğimde script çalışmıyordu. Ama MS-DOS Edit programı ile düzenleyip sonra da upload ettiğimde script gayet güzel çalışıyordu.

Bu tamamen işletim sistemleri arasındaki TEXT format farklığıydı. Evet Unix'ten gelen TEXT metin NOTEPAD ile düzgün açılıyordu, ama NOTPAD ile kaydedilen metin Unix'te düzgün çalışmıyordu. Fazlada kafamı yormadım, ve buna hep dikkat ettim o dönemlerde.

Şöyle basit bir ASP.NET formu yapıyordum, bir etiket ve etikete "ŞİŞLİ YAĞMUR ISLAK" yazıyordum, sonra bu sayfayı çağırdığımda bu metin bozuk görünüyordu. Unix sistemde başıma gelen olayı hatırladım ve ben ASP.NET sayfalarını (dosya formatı) ANSI olarak kaydettiğimi düşündüm. Delphi 2005'te acaba bunu UTF-8 olarak kaydetmenin bir yolu var mı diye düşünürken, pat kapı çaldı kimo dedim, dışarıdaki ses "abi ben contex menü, hani sağ düğmeye basınca açılıyor ya" birden şimşek çaktı kafamda ve editörün üstündeyken sağ düğmeye basıp menüyü açtım orada FORMAT seçeniği içinden UTF-8'i gördüm. Ve öylece dosyayı kaydettim. Artık ASP.NET örnek sayfam UTF-8 formatında keydedilmişti. Hemen sayfayı çağırdım; tam istediğim sonuç karşıma gelmişti.

İşte tek sorun buymuş meğerse. Zaten varsayılan olarak web.config içindeki kodlarda UTF-8 tanımlaması mevcut, hiç edit yapmanıza gerek yok.


Yapnamız gerekenler sırasıyla:
  • "web.config" dosyasında aşağıdaki satırları gösterildiği değiştirin. globalization yazan satırı silip aşağıdakini yazın.

    (ENGLISH) Change "web.config" file like this.
.
.
.
<system.web>

.
.
.

<globalization

fileEncoding="utf-8"

requestEncoding="utf-8"

responseEncoding="utf-8"

/>
</system.web>

.
.

.

  • ASPX dosyanızı UTF-8 formatında kaydedin. Delphi 2005 kullanıyorsanız, CODE sayfasına geçip, sayfanın ortasındayken mouse sağ düğmeye basın ve çıkan menüden FILE FORMAT seçeniği içindeki UTF-8'i seçiniz.

    (English) You must save your ASPX file under UTF-8 file format. If you using Delphi 2005 or 2006, select FILE FORMAT menu when opening context menu with right mouse button in CODE page of .aspx file. (burda ingilizce olarak saçmaladım galiba, umarım anlarlar)

Buraya kadar olan kısımdakiler bize ne sağladı?
Şimdi ASP.NET formu üstüne ister Türkçe ister Japonca ya da başka bir dil ile yazacağımız metinlerin düzgün çıkması sağlıyor. Mesela formun üstüne bir Button koyup, button'a basılında bir etiketin içine "ŞİŞLİ YAĞMUR" yazdırmak istersek düzgün çıkacaktır. Hoş bunun için ikinci anlattığıma gerek kalmıyor. Enterasandır, .ASPX file format ile .ASPX'e bağlı kodarkası file format farklı oluyor. İkinci anlattığım yani .ASPX dosyasını (kodarkası bir başka deyişle CODEBEHIND olarak ayrı duran .PAS, .VB kastetmiyorum) UTF-8 olarak kaydederek, ASP.NET formu üstüne manuel olarak yazdığınız Türkçe vb. dillerin düzgün çıkmasına olanak sağlıyoruz. web.config içindeki ayar ise, çıktı olarak üretilecek karakter setini tanımlıyor. Hani, düğmeye basınca bir etiketin içine "ŞİŞLİ YAĞMUR" metnini düzgün görünmesi için web.config içindeki değişikliğe ihtiyaç var. Gelelim diğer önemli konuya. Bu ASP.NET formu içindeki bir editbox'a Türkçe karakter yazıp gerek VeriTabanına gerekse de başka bir amaçla düzgün olarak iletilmesi için gerekli olan META TAG'dır.

  • Şimdi aşağıdaki META TAG'ı .ASPX içine yerleştirin.
    (English) Add Meta Tag to your .ASPX file on the below.

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

Şimdilik hepsi bu kadar. Aşağıdaki linklerde UTF-8 olarak keydedilmiş ve kaydedilmemiş iki örnek veriyorum. Özellikle FILE FORMAT olayı için iyi birer örnek olacaktır.

NO UNICODE EXAMPLE

UNICODE EXAMPLE

SOURCE CODES

Bu noktadan sonra şunuda belirtmek istiyorum. Daha önceden, Visual Studio ile ASP.NET sitesi yaparken manuel olarak yazılan yazılarda hiç bir sorun olmamıştı. Bu kullanılan IDE'ye göre farklılıklar olabileceğini gösteriyor. Normalde Delphi IDE'si ile form üstüne Japonca bir karakter yazıp SAVE derseniz, size bu dosyayı UNICODE olarak saklıyayım mı diyor. Visual Studio ise bunu sormuyor olsa gerek ki, düzgün çalışıyor. Ancak Delphi Türkçe bir metni Unicode olarak görmemiş olacak ki, dosyayı Unicode olarak saklamak istermisin siye sormuyor. Bunu ayrıca FILE FORMAT ile UTF-8 olarak belirterek çözüyoruz.

Sizinde anlayacağınız gibi, kullanılan araçlara göre farklılıklar olabiliyor. Kullandığımız araçları iyi bilmemiz bizlerin iyi şeyler ortaya çıkartmasına neden olacaktır.

Eğer bir ASP.NET sayfası hazırlarken kullandığınız IDE zaten UTF-8 formatında dosyayı kaydediyorsa -ki bunu manuel olarak formun üstüne yazdığınız bir metin ile test edebilirsiniz- siz sadece META TAG ve web.config değişikliklerini yapınız.


Top of page

3 yorumlar:

yunus said...

murat bey.merhabalar. makaleniz için teşekkürler.benim de bu türkçe karakter konuda bir sorunum var.
yapmak istediğim asp.net sayfasına gridview kontrolüne bir excel dosyasından veri aktarmak,sonra bir butona tıklayıp bu gridviewdeki verileri mysql veritabanına atmak. asp.net sayfamdaki gridview kontrolüme excel dosyamdan veriler gayet sorunsuz geliyor.yani türkçe karakterler de sorunsuz görünüyor sayfada.fakat verileri mysql tabloma aktarmak istediğimde mysql veritabanımda o verileri okutunca türkçe karakterler sorunlu görünüyor.(mysql içinde o tabloma türkçe karakterli veriler insert ettiğimde de bi problem çıkmıyor)

yani asp.nete excel den veri gelirken veya mysql içinde tabloya veri insert ederken sorun yok.

ama asp.net sayfamdan mysql veritabanıma insert etmek istediğimde sanırım problem var.

web config de ve asp.net sayfamın html source ında gerekli ayarları yaptım belirttiğiniz üzere.ama olmıuyor

mysql tekrar kurdum ut8 olarak yine olmuyor.

asp.net sayfamı encodingli save ettim , html source ına codepage değerini girdim

yine olmuyor.

sizce nerde eksiğim var.

cevabınızı dört gözle bekliyorum çünkü dünden beri bu problemi aşamadım:((((

M. Murat Dicle said...

Merhaba,

Benimde ilk başlarda başıma çk geliyordu böyle şeyler. Sayfa içinden birşeyleri veritabanına gönderirken, türkçe karakterlerde sorun çıkıyordu. Sonra anladım ki, Session (oturum) ilk açıldığındaki ilk post'ta Türkçe karakterler hatalı görünüyor.

Bir .NET sayfasınız var. Üstünde ADI ve TELEFONU diye iki kutu olduğunu düşünün. Bu veriler DB'ye kaydedilecek. Şimdi bu sayfayı derleyin ve ilk denemenizde Türkçe karekterli birşeyler girin.

göreceksiniz ki, ilk kayıtta Türkçe karakterler bozuluyor. Ama ikinci bir kayıtta Türkçe karakterler bozulmuyor.

Tabi yukarıdaki yazımdaki gibi ayarları yapmanız gerekiyor.

yunus said...

murat bey.tekrar merhabalar.
cevabiniz icin tesekkur ederim.

belirttiginiz sekilde problemi cozemedim:(( sadece ilk kayit girislerinde degil diger kayit girislerinde de problem oluyordu.yani olmuyordu.

sonradan fark ettim ki veriler excel den datasete duzgun gelior ama gridviewden cikarken turkce karakterler bozuluor.

cozum olarak da datasetten direk mysqle veri gonderdim gridview i pas gecerek.
boylece problem cozuldu.ne kadar rahatladim anlatamam:))))

bu tip bir problemle karsilasan okurlarinizin hem sizin hem de benim cozumumden faydalanmasi dilegimle.

iyi gunler.