URL slug üreteci

Bir başlığı URL slug’ına çevirir; İbranice, Arapça, Kiril ve Yunancayı çevriyazar, yanında Unicode yol biçimi ve listeler için çakışma denetimiyle.

Slug
creme-brulee-grusse-aus-munchen
Unicode yol — çevriyazı yok, hiçbir şey kaybolmaz
crème-brûlée-grüße-aus-münchen
Yüzde kodlu — sunucunun gördüğü
cr%C3%A8me-br%C3%BBl%C3%A9e-gr%C3%BC%C3%9Fe-aus-m%C3%BCnchen

Bir tarayıcı yukarıdaki okunabilir biçimi gösterir ve bunu gönderir. İkisi de aynı yoldur.

Bu araç ne yapar

Herhangi bir betikte bir başlık yapıştırın, bir URL’nin taşıyabileceği slug olarak geri gelir: küçük harf, noktalama yok, seçtiğiniz bir ayırıcıyla birleştirilmiş kelimeler. Latin aksanları kaldırılır ve İbranice, Arapça, Kirilce ve Yunanca Latin harflerine çevriyazılır.

Slug’ın yanında aynı başlık kendi betiğinde tutulmuş olarak durur. O biçim de yasal bir yoldur ve çevriyazıda en çoğu kaybeden betikler için çoğu zaman daha iyi yanıttır — bu yüzden aracın sizin için seçmesi yerine ikisi de tek bir başlıktan üretilir.

Bir slug ne içindir

Bir slug, bir URL’nin insanların okuyabildiği kısmıdır: son eğik çizgiden sonraki, sayfayı numaralandırmak yerine adlandıran parça. Var, çünkü kelime olarak okunan bir yol bir mesaja yapıştırılmaktan, bir slaytta yazdırılmaktan ya da bir telefonda sesli okunmaktan sağ çıkar ve sayısal bir kimlik bunların hiçbirini yapmaz.

Şeklin bu kadar kısıtlı olmasının nedeni de budur. Bir slug kararlı olmalıdır — onu değiştirmek zaten sayfayı gösteren her bağlantıyı bozar — ve elle yazıldığında belirsizlikten uzak olmalıdır, ki bu boşlukları, bir okurun yeniden üretip üretemeyeceği büyük harfleri ve bir kabuğa ya da bir Markdown ayrıştırıcısına bir şey ifade eden noktalamayı dışlar.

Aksanlar nasıl kalkar

Çoğu Latin aksanı bir tablo tarafından değil, platform tarafından kaldırılır. Unicode, é’yi düz bir e’nin ardından birleştirici bir keskin aksana ayrıştırılabilir olarak tanımlar; böylece o ayrıştırılmış biçime normalleştirmek ve sonra her birleştirici işareti atmak düz harfi geride bırakır. Aynı işlem ñ, ç, ő ve birkaç yüz tanesini daha ele alır ve tarihi geçemez, çünkü tarayıcının zaten gönderdiği Unicode verisini kullanır.

Her şeyi ele almaz ve boşluk hakkında bilmeye değer. İşareti, glifin üstündeki bir işaret değil, glifin içinden geçen bir çizgi olan bir harf — ø, ł, đ, ħ, ŧ — hiç ayrıştırması olmayan tek, bölünmez bir karakterdir; bu yüzden işaretleri kaldırmak onu tam olduğu gibi bırakır. Bir ligatür de öyle: ß, æ ve œ’nin her biri bir harf artı süsleme için değil, bir ses dizisi için durur. Bunların hepsi açık bir yazım gerektirir ve onsuz slug’dan yalnızca kaybolurlardı.

Dil ayarı yanıtı neden değiştirir

ü’nün tek bir doğru romanlaştırması yoktur. Almanca onu diyerezis var olmadan önce ue olarak yazmıştır — iki nokta küçük bir üst simge e olarak başladı — bu yüzden Müller doğru biçimde mueller’dir ve bir Alman okur muller’i yanlış bulur. Fransızca, İspanyolca ve Portekizce aksanlarını, aksi hâlde kendisi olan bir harf üzerindeki işaretler olarak ele alır; bu yüzden crème brûlée doğru biçimde creme-brulee’dir ve onu cruemme olarak yazmak saçmalık olurdu.

Kuzey dilleri aynı şekilde birbiriyle anlaşamaz. Danca ve Norveççe, harfin yerini aldığı eski yazımı izleyerek ünlüyü ikiye katlar; İsveççe katlamaz:

  • Almanca — ä, ae olur, ö, oe olur, ü, ue olur, ß, ss olur. München, muenchen’dir.
  • Danca ve Norveççe — æ, ae olur, ø, oe olur, å, aa olur. Ålborg, aalborg’dur.
  • İsveççe — ä, a olur, ö, o olur, å, a olur. Ålborg, alborg’dur.
  • Genel — her işaret düşürülür ve temel harf tutulur. Ålborg, alborg’dur, München, munchen’dir.

Bunlar tek bir yanıtın rakip yaklaşımları değildir; dört farklı soruya dört farklı doğru yanıttır. Yalnızca biri varsayılan olabilir; bu yüzden ayar görünürdür ve araç, baktığınız şeyi hangi kuralın ürettiğini söyler. Bir harf her yerde aynıdır: ß bir aksan değil, bir ligatürdür; bu yüzden onu düşürmek bir sesi silerdi ve burada her ayarda ss’dir.

Bir tabloya ihtiyaç duyan betikler

Tarayıcıdaki hiçbir şey Kirilceyi, Yunancayı, İbraniceyi ya da Arapçayı romanlaştırmaz; bu yüzden her biri, yayımlanmış bir standarda karşı elle yazılmış bir tablodur. İkisi iyi çıkar, çünkü ünlülerini yazarlar:

  • Kirilce, İngilizce haritalar ve pasaportlardaki romanlaştırma olan BGN/PCGN’yi izler: ж, zh’dir, ч, ch’dir, щ, shch’dir, х, kh’dir. Москва, moskva olur ve Чехов, chekhov olur.
  • Yunanca, tanımladığı digrafler dahil ELOT 743’ü izler: ου, oy değil ou’dur ve ευ, ev’dir. Αθήνα, athina olur ve Ευρώπη, evropi olur.

ISO 9, diğer iyi bilinen Kiril standardıdır ve burada bilerek kullanılmaz. Tersine çevrilebilirdir, ki amacı budur, ama bunu aksanlarla başarır: ж, ž’dir. Bir slug’ın bir çengel (caron) için yeri yoktur; bu yüzden hemen z’ye düzleşirdi — ve Жуков ile Зуков aynı slug olurdu. BGN digrafı düzleşmeden sağ çıkar.

Kiril tablosunda yanlış yapması kolay ve belirtmeye değer bir ayrıntı. ё ve й aksanlı harfler gibi görünür ve Unicode onları o şekilde ayrıştırır, ama işaret, onları aynı harf üzerinde süsleme değil, farklı harfler yapan şeydir. Tabloya bakmadan önce işaretleri soymak — buradaki diğer her betik için doğru sıra — sessizce Ёлка’yı elka’ya ve Андрей’i andrei’ye çevirir.

İbranice ve Arapça ve ne kaybettikleri

Her iki betik de ünsüzleri yazar ve çoğu ünlüyü sıradan metnin taşımadığı noktalara bırakır. Bu, bu aracın daha iyi bir tabloyla çözebileceği bir kodlama sorunu değildir: bilgi metinde yok. מאמר dört harftir, mem-alef-mem-resh ve maamar okuması, kelimeyi zaten bilen bir okurdan gelir. Harf harf yalnızca mamr olabilir.

Yapılabilecek olan yapılır. Bir harf bir ünlü işareti olarak da hizmet ettiğinde konum kullanılır, çünkü noktalanmamış metnin bıraktığı tek sinyal budur:

  • ו ve י bir kelimenin başında ünsüz ve içinde ünlü harfleridir; שלום’u shlvm yerine shlom’a çeviren budur.
  • İkiye katlanmış bir וו ya da יי her iki yerde de ünsüzdür — o ikiye katlanma, İbranice’nin iki okumayı ayırt etme biçiminin ta kendisidir.
  • ב‎, כ ve פ bir kelimenin başında bir kapantı ve içinde bir sürtünmelidir. Farkı işaretleyen dageş bir ünlü noktasıdır; bu yüzden geriye kalan yalnızca konumdur.
  • Bir gereşin izlediği bir harf, alfabenin harfi olmayan sestir: ג׳, j’dir, צ׳, ch’dir, ז׳, zh’dir. Onu yok saymak ג׳אז’ı farklı bir kelimeye çevirirdi.
  • Arapça vurgulu ünsüzler, ASCII’nin onları ayırt eden alttaki noktayı koyacak yeri olmadığı için düz karşılıklarına çöker. صابر ve سابر aynı slug’ı üretir.

Sonuç okunabilir ve tanınabilirdir ve kimsenin doğru diyeceği bir yazım değildir. Araç, kayıplı bir yanıtı bitmiş bir yanıtmış gibi sunmak yerine her İbranice ya da Arapça sonuçta bunu söyler — ve hiçbir şey kaybetmeyen aşağıdaki biçimi gösterir.

Çevriyazı gerektirmeyen Unicode yol

Bir URL yolu ASCII ile sınırlı değildir. RFC 3987, IRI’yi tanımlar — herhangi bir Unicode karakteri içerebilen bir tanımlayıcı — ve birini tele koyma kuralı, UTF-8 baytlarını yüzde kaçışları olarak kodlamaktır. Her tarayıcı bunu yirmi yıldır yapar; Wikipedia’nın İbranice ve Rusça makale başlıklarını kendi adları altında sunmasının ve adres çubuğunun onları okunabilir göstermesinin nedeni budur.

Yani buradaki ikinci çıktı, noktalaması ve boşluğu temizlenmiş ve başka hiçbir şeye dokunulmamış başlıktır ve üçüncüsü bunun telde gerçekte nasıl göründüğüdür. İkisi aynı yoldur: okunabilir olan, bir tarayıcının gösterdiği ve bir kişinin kopyaladığıdır ve kodlanmış olan, sunucunun günlüğe yazdığıdır.

Hangisini kullanacağınız bir formalite değil, gerçek bir karardır. Unicode biçimi hiçbir şey kaybetmez, dili konuşan herkese doğru okunur ve bir arama motorunun göstereceği şeydir. Çevriyazılmış biçim, kodlamaları bozan yerlere yapıştırılmaktan sağ çıkar, ASCII yolları varsayan sistemlere sığar ve bir telefonda sesli okunabilir. Özellikle İbranice ve Arapça için Unicode biçimi genellikle daha iyi yanıttır, tam da çevriyazı ünlüleri geri getiremediği için.

Bir Arapça başlık, sonuna kadar götürülmüş

Bütün bunlar sıradan tek bir başlıkta buluşur; işte baştan sona götürülmüş bir tane. تعلم البرمجة, programlamayı öğrenmek demektir — iki kelime, noktalama yok, ünlü işareti yok; Arapça bir ders kitabının, bir sözlüğün ve kutsal bir metnin dışında her yerde böyle yazılır.

Geri dönen üç biçim var. Slug tlm-albrmjh’dir; Unicode yol تعلم-البرمجة’dir, yani ayırıcının boşluğun yerini aldığı başlığın kendisi; telde ise aynı yol %D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9, yani aynı iki kelimenin UTF-8 baytlarıdır. Üçünden yalnızca ilki bir şey kaybetti ve iki kelimenin her birinde kaybetti:

  • تعلم, taallum diye okunur. Dört harf girer, üç harf çıkar: ع için Latin alfabesinde bir harf yoktur, bu yüzden uydurma bir işaretle yazılmak yerine düşer; okurun duyduğu kısa ünlüler ise zaten hiç yazılmamıştır.
  • البرمجة, al-barmaja diye okunur. Belirlilik takısı ال, al olarak gelir; kelimeyi kapatan ta marbuta ة ise h yazılır; biçimini ödünç aldığı harfe göre, duyulan a diye değil: bu yazı sisteminin dışarıda bıraktığı şey tam da ünlüdür.
  • tlm-albrmjh’yi geriye doğru okuyun; içinde ünsüzlerin arasında hangi ünlülerin durduğunu söyleyen hiçbir şey yoktur. taallum kelimenin ne olduğudur, tlm harflerin ne olduğudur ve birinden ötekine ancak kelimeyi zaten bilen biri geçebilir.

Kayıp okumakla sınırlı değildir. عمر, yani Omar adı, mr olarak döner — bambaşka bir kelime olan مر de öyle döner, çünkü ikisini ayıran ع gitmiştir. Birbirinden farklı iki başlık bu yüzden tek bir slug’a düşebilir; liste modu bunu sessizce numaralandırmak yerine çakışma olarak işaretler. Her birinin Unicode yol biçimi ikisini ayrı tutar, çünkü her şeyi tutar.

Çakışmalar ve neden sizin için çözülmedikleri

Slug’lamak noktalamayı soyar; bu yüzden yalnızca noktalamada farklı başlıklar hiç farklı olmaktan çıkar. «Our guide to CSS» ve «Our guide to CSS!» iki gönderi ve bir slug’dır. Liste modunda böyle her çakışma, çakıştığı satırla işaretlenir, çünkü bu, bir içerik yönetim sisteminin gizlediği hatadır: sessizce bir son ek ekler, yayımlar ve beklediğiniz URL diğer gönderiye aittir.

Son ek bir düğme olarak sunulur ve WordPress ve Django tarzını üretir — our-guide-to-css, our-guide-to-css-2 — bir listenin olduğu gibi bir yere yapıştırılması amaçlandığı durum için. Varsayılan olarak kapalıdır, çünkü bir çakışma genellikle bir adlandırma sorunundan çok bir içerik sorunudur ve çakışma, düğme açık olduğunda bile işaretli kalır; böylece onu açmak hiçbir şeyi gizlemez.

Uzunluk ve doğru yerde kesme

Bir uzunluk sınırı bir ayırıcı sınırında keser, asla bir kelimenin içinde değil. Kelime ortasında kırpmak, daha kısa bir slug üretmekten çok farklı bir tane üretir — introduction-to-crypt, daha derli toplu bir introduction-to-cryptography değildir — ve yarım bir kelime, başka bir şey ifade eden bir kelimedir. Tek bir kelime sınırdan uzunsa, üzerinde kesilecek bir sınır yoktur ve dilimlenmek yerine bütün olarak döndürülür.

Evrensel olarak doğru bir sınır yoktur. Arama motorları bir URL’nin kabaca ilk altmış-yetmiş karakterini gösterir ve eski sistemler bazen bir yol segmentini sınırlar, ama hiçbir şey belirli bir sayıda bozulmaz. Alanı boş bırakmak slug’ı başlığın ihtiyaç duyduğu kadar uzun bırakır.

Sıkça sorulan sorular

Bir URL slug’ında hangi karakterler güvenlidir?
Küçük harfli ASCII harfleri, rakamlar ve tek bir ayırıcı istisnasız her yerde çalışır. Tire geleneksel ayırıcıdır; alt çizgi özdeş biçimde çalışır ama altı çizili bir bağlantının altında görülmesi daha zordur. Boşluklar, büyük harfler ve noktalama teknik olarak kodlanabilir ve pratikte sorun çıkarır; bu yüzden bir slug onları soyar.
Tire mi alt çizgi mi?
Bir tire, modayı aşan iki nedenle. Her büyük platformun kullandığı şeydir; bu yüzden okurların ve diğer araçların beklediği şeydir ve çoğu bağlantının taşıdığı altı çizginin altında kaybolur, ki bir alt çizgi kaybolmaz. Seçim burada sunulur, çünkü var olan sistemlerin var olan kuralları vardır ve tek bir site içindeki tutarlılık her iki yanıttan daha önemlidir.
İbranice ya da Arapça başlığım neden ünlülerini kaybediyor?
Çünkü hiç yazılmadılar. Her iki betik de çoğu ünlüyü sıradan metnin atladığı noktalarla işaretler; bu yüzden hangi kelimenin kastedildiğini tahmin eden bir seslendirme motoru olmadan herhangi bir aracın üretebileceği tek şey harf harf bir okumadır. Bu araç, gerçekte orada olanı çevriyazar, sonuçta bunu söyler ve başlığı tam olarak yazıldığı gibi tutan Unicode yol biçimini sunar.
Arapça başlığım neden yalnızca ünlüleri değil, bütün harfleri kaybediyor?
Çünkü iki Arapça ünsüzün dönüşeceği bir Latin harfi yoktur. ع ve ء, İngilizcenin yazmadığı seslerdir ve onlar için bir işaret uydurmak, onları kaybetmekten daha kötü olurdu; bu yüzden düşerler — تعلم bu nedenle dört harften üçü olan tlm olarak döner. Ünlüler daha bilinen kayıptır ve tek kayıp değildir. Slug’ın yanındaki Unicode yol biçiminde bu iki sorunun ikisi de yoktur, çünkü hiçbir şeyi çevriyazıya dökmez.
Bir URL doğrudan İbranice, Arapça ya da Çince içerebilir mi?
Evet. Bir yol herhangi bir Unicode karakteri tutabilir; telde UTF-8 olarak yüzde kodlanır ve tarayıcı tarafından okunabilir gösterilir. Wikipedia’nın kapsadığı her dilde makale başlıklarını böyle sunar. Bu araç hem okunabilir biçimi hem kodlanmış olanı gösterir, çünkü ikincisi sunucu günlüklerinde ve analizde görünen şeydir.
Müller neden bazen mueller bazen muller?
Çünkü ikisi de farklı dillerde doğrudur. Almanca çift noktayı yazıya döker — iki nokta küçük bir üst simge e olarak yaşama başladı — Fransızca ve İspanyolca ise aksanlarını, aksi hâlde kendisi olan bir harf üzerindeki işaretler olarak ele alır. Dil ayarı bir kural seçer ve araç hangisini uyguladığını size söyler.
İki başlığım neden aynı slug’ı üretiyor?
Çünkü slug’lamak noktalamayı ve büyük/küçük harfi kaldırır, ki bu çoğu zaman iki başlığı ayıran tek şeydir. Liste modu her çakışmayı çakıştığı satırla işaretler. WordPress tarzı -2 son ekini açabilirsiniz, ama temeldeki soru — iki gönderinin gerçekten neredeyse aynı ada sahip olması gerekip gerekmediği — önce yanıtlamaya değer.
Yazdığım herhangi bir şey bir sunucuya gönderiliyor mu?
Hayır. Her dönüşüm tarayıcınızda çalışır; hiçbir şey yüklenmez ya da günlüğe yazılmaz ve ağ bağlantısı olmadan çalışır.

İlgili araçlar