Asp.Net Core MVC’de Türkçe karakterlerin kaynak kodlarında bozuk görünmesi (Asp.Net Core MVC Character Encoding Problem)

987Görüntülenme
16 Ağustos 2018
2 Yorum
Kategori: Yazılım
Asp.Net Core MVC’de Türkçe karakterlerin kaynak kodlarında bozuk görünmesi (Asp.Net Core MVC Character Encoding Problem)

Merhaba Arkadaşlar,
Asp.Net Mvc ile web uygulamaları geliştirirken sunucu tarafından Model Binding, ViewBag, ViewData, TempData vb. yöntemleri ile aldığımız veriler, sayfanın kaynak kodlarını incelediğimizde aşağıdaki örnekte de olduğu gibi, Razor View Engine tarafından bazı özel karakterlerin bozuk bir şekilde gelmesine neden olmaktadır. Bu durum SEO (Arama Motoru Optimizasyonu) açısından ciddi bir sorun teşkil etmektedir. 

Örneğin meta tag contentlerini ViewBag yöntemi ile aktarınca bahsettiğimiz, karakter sorunu oluşmaktadır.

 

public IActionResult Index()
{
    ViewBag.title = "Sayfa Başlığı Türkçe Karakter Sorunu";
    ViewBag.description = "Korkma, sönmez bu şafaklarda yüzen al sancak";
    ViewBag.keywords = "Türkçe, bilişim, gelişim, sayfası";
    return View();
}

 

 

Çözüm Yolları - Solutions
1-Html.Raw() Metodu


Sunucu tarafından gelen verileri, tek tek bu metodu kullanarak View'de ilgili yerlere yazdırmak. 

 

<title>@Html.Raw(ViewBag.title)</title>
<meta name="keywords" content="@Html.Raw(ViewBag.keywords)" />
<meta name="description" content="@Html.Raw(ViewBag.description)" />

bu şekilde karakter problemini çözmüş oluruz. Fakat birden fazla sayfa veya view için düşündüğümüzde kullanılabilir bir tarafı olduğu söylenemez.

 

2-Startup Sınıfı, Konfigürasyon Ayarları

Startup sınıfı içerisinde yer alan ConfigureServices metodunu, geliştireceğimiz uygulamanın içerisinde yer alacak servisleri, belirtmek için kullanırız. Bu metod içerisine AddSingleton yaşam döngüsüne sahip bir Dependency Injection ekleyerek sorunumuzu çözebiliriz. HtmlEncoder sınıfının Create metodu ile uygulama bazında karakter kodlama yapısında güncelleme yapabiliriz.

 

public void ConfigureServices(IServiceCollection services)
{
   services.AddSingleton(HtmlEncoder.Create(allowedRanges: new[] { UnicodeRanges.BasicLatin, UnicodeRanges.Latin1Supplement, UnicodeRanges.LatinExtendedA }));           
}

 

Burada dikkat edilmesi gereken nokta: izin verilen aralıklar için (allowedRanges) kullanacağımız dil sınıflarının (ailelerinin) doğru tespit edilmesi olacaktır. Tüm karakterlerin uygulama tarafından kabul edilmesi (UnicodeRanges.All) bir güvenlik problemi ve performans açısından dezavantaj sağlayacağı için kullanma taraftarı değilim. Uygulamanızda yer alacak özel karakterlerin, hangi dil sınıfında yer aldığını öğrenmek için bu adresi inceleyebilirsiniz: https://www.compart.com/en/unicode

 

Bir sonraki makalemizde görüşmek üzere, esen kalınız.

Yorumlar

Erdem Selçuk

22.5.2019 17:50:00

Çok faydalı oldu Bekir Bey, teşekkürler.

Sinan D

21.6.2019 07:58:00

teşekkürler

Bir Cevap Yazın

BEKİR OTURAKÇI

BEKİR OTURAKÇI