İçeriğe geç
Eski bir Adler daktilonun tuş takımı; yuvarlak siyah tuşların üzerinde büyük harfler ve sağ üstte kırmızı bir tuş.
"Adler Typewriter Keyboard Close-up", Maksym Kozlenko, CC BY-SA 4.0, Wikimedia Commons üzerinden. 3:2 oranına kırpıldı.

Türkçe not tutan herkes bunu bir kez yaşıyor: aradığın kelime notta duruyor, arama bulmuyor. Sebep çoğunlukla yazım hatası olmuyor. Sebep, alfabedeki dört ayrı harfin İngilizce için yazılmış bir kodda iki harfe indirgenmesi.

I ile i Türkçede akraba değil

Türk alfabesinde noktasız I/ı ile noktalı İ/i iki ayrı harftir. ışık ile isik farklı kelimeler, Irak ile İrak farklı ülkelerdir.

Çoğu programlama ortamının varsayılan küçük harfe çevirme işlemi bunu bilmez. JavaScript’te "I".toLowerCase() sonucu "i" verir; aynı işlem Türkçe yerel ayarıyla, yani "I".toLocaleLowerCase("tr") biçiminde yapıldığında "ı" verir. ISTANBUL yazan bir başlık, hangi yolu seçtiğine göre ya istanbul ya ıstanbul hâline geliyor. Kullanıcı ise ikisini de arayabilir.

Küçük harfe çevirmenin dizeyi uzattığı yer

Asıl tuhaflık burada. "İ".toLowerCase() tek bir harf döndürmüyor: sonuç, i harfi artı ayrı bir birleşen noktadan oluşan iki kod noktalı bir dize.

Bunun görünen sonucu şu: "İSTANBUL".toLowerCase() sekiz değil dokuz karakter uzunluğunda ve "istanbul" ile eşit çıkmıyor. Ekranda iki dize tıpatıp aynı görünür. Karşılaştırma false döner, hata kaydına “arama bozuk” diye geçer ve kimse dizenin uzunluğuna bakmayı akıl etmez. Türkçe yerel ayarıyla çevirdiğinde "İ".toLocaleLowerCase("tr") beklenen tek karakteri veriyor.

Aksan temizlemenin yarım kaldığı yer

Yaygın çözüm, dizeyi ayrıştırıp birleşen işaretleri silmek. Çiğdem böylece cigdem olur ve Türkçe klavyesi olmayan kullanıcı da bulur.

Yöntem beş harfte çalışıyor, bir harfte çalışmıyor. ç, ğ, ö, ş, ü ayrıştırıldığında taban harf artı işaret olarak yazılabilir. Noktasız ı ise ayrıştırılamayan tek bir kod noktası. İşaret temizleyen bir normalleştirici ona hiç dokunmaz: ışık kelimesi isik olmuyor, ısık oluyor.

Aynı işlem İstanbul üzerinde çalıştığında sonuç büyük noktasız harfle Istanbul çıkar. İki durumda da ortada bir hata mesajı yok, yalnızca bulunamayan bir kelime var.

Sıralamada Türkçe daha katı

Beklenmedik taraf şu: doğru yerel ayar aramayı hoşgörülü yapmıyor, katılaştırıyor.

Intl.Collator ile en düşük duyarlılıkta karşılaştırma yaptığında İngilizce c ile ç harflerini aynı sayar. Türkçe saymaz, çünkü Türkçede ikisi gerçekten ayrı harf; s ile ş, o ile ö için de durum aynı. Buna karşılık i ile İ aynı ayarda eşit sayılıyor.

Sıralama ile arama iki ayrı iş. Sıralama alfabetik doğruluk ister; arama, kullanıcının klavyesinde yazabildiğiyle yetinmek zorundadır.

İşe yarayan adım hangisi

Hem içeriği hem sorguyu tek bir arama anahtarından geçirmek gerekiyor. O anahtarın belirleyici adımı, alfabetik olarak yanlış olan adım: ı ile i harflerini bilerek aynı harfe indirmek.

Zincir üç adım. Türkçe yerel ayarıyla küçük harfe çevir, ı harfini i yap, sonra ayrıştırıp birleşen işaretleri sil. Bu zincirden geçen IŞIK, ışık ve isik aynı anahtara varıyor; Çiğdem ile cigdem de öyle.

İkinci adımı atlayan bir normalleştirici, aynı kelimenin iki yazımını iki ayrı anahtara gönderir. Varsayılan küçük harfe çevirmeyi aksan temizliğiyle birleştiren yaygın tarif tam olarak bunu yapıyor: IŞIK girdisi isik olurken ışık girdisi ısık kalıyor. Aynı kelimeyi büyük harfle yazan bulur, küçük harfle yazan bulamaz.

Bu zinciri sıralamada kullanma. Orada doğru cevap Türkçe alfabetik sıradır ve ç harfini c sayan bir liste Türkçe okuyan birine baştan yanlış görünür. Context’te aramanın Türkçe karakterlere takılmamasının arkasında duran şey bu ayrım: aynı metnin biri hoşgörülü, biri kesin iki temsili.

Tüm yazılar

BAŞLAMAK

Şimdi tarayıcında açabilirsin.

Web sürümü canlı ve tam sürüm — kısıtlı bir deneme kopyası değil. Beğenmezsen sekmeyi kapatırsın, geride bir şey kalmaz.

  • Hesap gerekmiyor
  • Kart istemiyoruz
  • İlk alımda 14 gün deneme