Türkçe Karakterleri URL İçin Temizleme Kuralları
Sitenizin adresinde %C5%9F veya %C4%B0 gibi tuhaf kodlar gördünüz mü? Bu, temizlenmemiş bir Türkçe karakterin tarayıcı tarafından otomatik kodlanmasıdır. Bu rehberde ç, ğ, ı, ö, ş, ü ve İ harflerinin URL için nasıl doğru biçimde ASCII'ye çevrileceğini, en sık yapılan hataları ve kod örneğini adım adım anlatıyoruz.
- Türkçe karakterler URL'de neden sorun çıkarır? (kısa cevap)
- Tam dönüşüm tablosu: 7 Türkçe karakter → ASCII
- Temizlenmezse ne olur? (percent-encoding örneği)
- Adım adım temizleme kuralları
- Yaygın temizleme hataları (İ/I tuzağı dahil)
- Kod örneğiyle: JavaScript'te Türkçe karakter temizleme
- Sık sorulan sorular
Türkçe karakterler URL'de neden sorun çıkarır?
Bu dönüşümü elle yapmak yerine slug oluşturucu aracını kullanarak herhangi bir Türkçe başlığı anında temizleyebilirsiniz. Ancak arka planda ne olduğunu bilmek, özellikle kendi CMS'inizde veya kodunuzda slug ürettiğinizde hataları önler.
Tam dönüşüm tablosu: 7 Türkçe karakter → ASCII
Aşağıdaki tablo, büyük ve küçük harf ayrımını da göstererek tam eşlemeyi listeler:
| Türkçe karakter | ASCII karşılığı | Örnek kelime |
|---|---|---|
| ç | c | çınar → cinar |
| Ç | c | Çorum → corum |
| ğ | g | öğün → ogun |
| Ğ | g | Ağrı → agri |
| ı | i | ışık → isik |
| ö | o | gözlük → gozluk |
| Ö | o | Ödemiş → odemis |
| ş | s | şeker → seker |
| Ş | s | Şirin → sirin |
| ü | u | üzüm → uzum |
| Ü | u | Ünye → unye |
| İ (noktalı büyük İ) | i | İzmir → izmir |
| I (noktasız büyük I) | i | IĞDIR → igdir |
Kaynak: Türk Dil Kurumu Türkçe alfabesi + Unicode karakter tablosu.
Türkçe karakter temizlenmezse ne olur?
ş harfi %C5%9F olur.
| Başlık | Sonuç |
|---|---|
| Temizlenmemiş (tarayıcının otomatik encode'u) | %C4%B0stanbul'da-Gezilecek-Yerler! |
| Doğru temizlenmiş slug | istanbulda-gezilecek-yerler |
Başlık: "İstanbul'da Gezilecek Yerler!" — iki sonucu doğrudan aracı deneyerek de karşılaştırabilirsiniz.
0xC5 0x9F); her bayt ayrı bir %XX grubuna dönüştüğü için tek bir Türkçe harf altı karakterlik bir koda çıkar. Bu, hem URL'yi uzatır hem de okunmasını imkânsız hale getirir.
Adım adım temizleme kuralları
Doğru bir Türkçe karakter temizleme işlemi, sırasıyla şu adımları izler:
- Karakter eşleme tablosunu uygula: ç,ğ,ı,ö,ş,ü,İ,I karakterlerini yukarıdaki sabit tabloya göre ASCII'ye çevir.
- Unicode NFD normalizasyonu ile güvenlik ağı ekle: İspanyolca, Fransızca, Almanca gibi diğer dillerden gelen aksanlı harfleri (é, ñ, ä) de yakalamak için metni NFD (Canonical Decomposition) ile ayrıştırıp kalan aksan işaretlerini kaldır.
- Küçük harfe çevir: Tüm metni küçük harfe indir.
- Boşlukları ayırıcıyla değiştir: Boşluk ve kalan özel karakterleri seçilen ayırıcıyla (genelde tire) değiştir.
- Kalan özel karakterleri temizle: Nokta, virgül, parantez, ünlem, emoji gibi alfasayısal olmayan her şeyi kaldır.
- Ardışık ayırıcıları teke indir: "--" gibi art arda gelen tireleri tek tireye indir.
- Baş ve son ayırıcıları kırp: Slug'ın başında veya sonunda kalan tireyi temizle.
Yaygın temizleme hataları
toLowerCase() fonksiyonuna güvenip Türkçe İ/I harflerini yanlış eşlemektir. Bunun dışında NFD normalizasyonunu atlamak, ardışık tireleri temizlememek ve kelimeyi bir sınırlama uygularken ortadan kesmek de sık görülen hatalardır.
"İ".toLowerCase() çağrısı — yerel ayar (locale) belirtilmediği sürece — beklenmedik bir sonuç üretebilir (birleşik nokta işaretli "i̇" gibi). Bu yüzden güvenilir bir slugify motoru, İ ve I harflerini locale'den bağımsız, sabit bir eşleme tablosuyla ayrı ayrı ele almalıdır — toLowerCase()'a bırakmamalıdır.
- Yalnızca küçük harfe çevirip Türkçe karakteri bırakmak: Tarayıcı bunları kendi başına percent-encoding'e çevirir.
- İ/I harflerini
toLowerCase()'a bırakmak: Locale'e bağlı, tutarsız sonuçlar üretebilir. - NFD normalizasyonunu atlamak: Türkçe dışı dillerdeki aksanlı harfler (é, ñ, ä) gözden kaçar.
- Ardışık ayırıcıları temizlememek: "İstanbul -- Ankara" gibi girişlerden çift tire (
--) sızabilir. - Kelimeyi ortadan kesmek: Maksimum uzunluk uygularken kelime sınırını değil karakter sayısını esas almak, "kahve-makinesi" yerine "kahve-makine" gibi kırık sonuçlar üretir.
Türkçe başlığını hemen temizle
Tüm bu adımları elle uygulamana gerek yok — başlığını yapıştır, temiz slug'ı anında al.
Slug Oluşturucuyu Aç →Kod örneğiyle: JavaScript'te Türkçe karakter temizleme
Yukarıdaki tüm adımları uygulayan, tarayıcıda çalışan basitleştirilmiş bir JavaScript örneği aşağıdadır. Bu, bu aracın kullandığı motorun sadeleştirilmiş halidir:
const CHAR_MAP = {
'ç':'c','Ç':'c','ğ':'g','Ğ':'g',
'ı':'i','İ':'i','I':'i',
'ö':'o','Ö':'o','ş':'s','Ş':'s',
'ü':'u','Ü':'u'
};
function slugify(text) {
let s = String(text).replace(/[çÇğĞıİIöÖşŞüÜ]/g, ch => CHAR_MAP[ch]);
s = s.normalize('NFD').replace(/[̀-ͯ]/g, ''); // güvenlik ağı
s = s.toLowerCase();
s = s.replace(/[^a-z0-9]+/g, '-'); // boşluk/özel karakter -> tire
s = s.replace(/-+/g, '-'); // ardışık tireleri indir
s = s.replace(/^-|-$/g, ''); // baş/son tireyi kırp
return s;
}
slugify("İstanbul'da Gezilecek Yerler!");
// -> "istanbulda-gezilecek-yerler"Bu kod, önce sabit eşleme tablosunu uygular (İ/I tuzağını önler), sonra NFD normalizasyonunu diğer diller için güvenlik ağı olarak kullanır.
Sık sorulan sorular
Türkçe karakterler URL için nasıl temizlenir?
Türkçe karakter temizlenmezse ne olur?
%C5%9F gibi 6 karakterlik çirkin bir koda dönüşür; URL hem okunmaz hem de bazı sistemlerde paylaşımda bozulma riski taşır.Büyük İ ile büyük I arasındaki fark URL temizlemede neden önemli?
toLowerCase() fonksiyonları bu ayrımı yapmaz ve hatalı sonuç üretebilir. Doğru bir slugify aracı bu iki harfi ayrı ayrı, sabit bir eşleme tablosuyla ele almalıdır.