Yüzde Kodlama İnceleyici

Yüzde kodlaması tek bir kural değil, birkaçıdır ve yaklaşık on karakterde birbirinden ayrılırlar. Bu sayfa aynı metni encodeURIComponent, encodeURI ve application/x-www-form-urlencoded serileştirmesinden yan yana geçirir, ayrıldıkları karakterleri işaretler, her karakter için UTF-8 baytları ve RFC 3986 sınıfıyla birlikte bir satır yazar ve bir dizginin kaç kez kodlandığını söyler. Çözme tarafı bir dizgiyi katı ya da gevşek bir kuralla okur ve sessizce yanlış bir sonuç vermek yerine hangi kaçışın bozuk olduğunu ve nerede olduğunu söyler.
Tüm işlemler tarayıcınızda yerel olarak yapılır — verileriniz hiçbir sunucuya yüklenmez.

Yüzde kodlamasının ne olduğundan emin değil misiniz? Yüzde kodlaması sade bir dille açıklanmıştır — ne olduğu, bir boşluğun neden %20 ya da + olduğu ve bir URL'de %25 göründüğünde ne anlama geldiği.
Bu ne yapar:
Kaçışları nasıl okuyun:
encodeURIComponent
encodeURI
form (application/x-www-form-urlencoded)
Girdide Ctrl+Enter etkin modu çalıştırır.
Bir kip seçin ve eylem düğmesine tıklayın. Kodla & incele metninizin üç kodlamasını ve karakter başına bir satır gösterir; Çöz kaçışları geri okur ve katmanları sayar. Öz-test düğmesi, bu sayfanın veri dosyasında kayıtlı her belgelenmiş örneği, her yazdırılabilir ASCII karakteri ve kayıtlı katman zincirlerini yeniden çalıştırır ve sayıyı burada raporlar.
Kodlayıcıların ayrıldığı yerler:Aşağıdaki karakterler dışındakiler üç yöntemde de aynı şekilde işlenir: yalnızca aşağıdaki karakterler üç yöntem tarafından farklı ele alınır. Geri kalan her şey üçünden de değişmeden geçer veya üçü de aynı şekilde kaçışlar.
Her karakter, satır başına bir tane:bir karakterin dönüştüğü UTF-8 baytları, RFC 3986'nın onu koyduğu sınıf ve her bağlamın yazdığı kaçış. Dört bağlam sütunu, bir tarayıcının bir yol, sorgu ya da parça oluştururken kullandığı WHATWG URL yüzde kodlama kümeleridir; gölgeli bir satır, üç kodlayıcının farklı işlediği bir karakterdir.
Bu sayfanın bir URL'nin her bölümü için kaçışladığı tam küme:kodlayıcının kendisinden yazdırılır, bu yüzden bu tablo ve üstteki sütunları dolduran kod birbirinden ayrılamaz. Her küme ayrıca C0 denetim karakterlerini (U+0000'dan U+001F'e) ve U+007E'nin üstündeki her kod noktasını kaçışlar; bu yüzden ASCII olmayan metin her bağlamda her zaman kaçışlanır.
Bu kümeler WHATWG yüzde kodlama kümelerinden türetilmiştir ve elle birleştirmeyi güvenli kılan iki kasıtlı yerde onlardan farklıdır: ham bir karma parçayı başlatacağı için bir sorgu içinde karma kaçışlanır; ve bileşen kümesi encodeURIComponent'in kaçışladığı karakterlerle, kesme işaretiyle birlikte tam olarak sabitlenmiştir, form kümesi ise URLSearchParams'ın kaçışladığı karakterlere sabitlenmiştir. Bu nedenle yukarıdaki tablodaki iki sütun, platformun yeniden uygulaması değil, kendi davranışıdır. Bu liste insanların şaşırtıcı bulduğu bir sonucu da açıklar: bir yüzde işareti hem encodeURIComponent hem de encodeURI tarafından kaçışlanır, ama WHATWG bağlam kümelerinin hiçbirinde yoktur, bu yüzden karakter başına tablonun yol, sorgu ve parça sütunları onu olduğu gibi bırakır. Elle birleştirdiğiniz bir URL'deki ham bir yüzde işareti yine de bir risktir, çünkü standart girdinin önce doğrulanmış olmasını bekler: bir sorgu içindeki %41, birçok sunucu çatısına tek bir A'dır ve bu sayfanın kendi katı okuması yalnız bir %'i bozuk bir kaçış sayar. Onu kendiniz %25 olarak kaçışlamak daha güvenli bir alışkanlıktır ve karakter başına tablo iki yazımı yan yana gösterir.
Bu dizgi kaç kez kodlanmış:her çözme turu bir katmandır. İki kez kodlanmış bir değer şununla başlar%25tek bir kodlamanın bıraktığı yer%20, ve üç kez kodlanmış bir değer şununla başlar%2525.
Bir URL'nin olduğu gibi taşıyabileceği karakterler:RFC 3986 ASCII aralığını üç gruba böler ve kaçış kuralları yalnızca bu bölünmeye karşı anlam taşır.
Ayrılmış karakterler yasak değildir, kullanılmışlardır: URL ayrıştırıcısı için bir anlamları vardır. Listeden çıkan kural kısadır — bir karakter ayrılmışsa ve onu veri olarak kastediyorsanız kaçışlayın; ayrılmamışsa asla kaçışlamanız gerekmez.
Üç yöntem ve neyi olduğu gibi bıraktıkları:
Listeler, her yöntemin ASCII aralığında kaçışlanmadan bıraktığı tam kümelerdir; öz-test her yazdırılabilir ASCII karakteri bunlara karşı denetler, bu yüzden tablo tarif ettiği kodlayıcılardan uzaklaşamaz.
Bu sayfanın kabul ettiği girdi boyutu ve nedeni:Yüzde kodlaması metin üzerinde tek bir geçiştir, bu yüzden bu sitedeki taban dönüştürücülerinden farklı olarak maliyet bir kare olarak değil doğrusal büyür: aritmetiğin kendisinin sorun olacağı bir uzunluk yoktur. Aşağıdaki sınırlar, karakter başına tablonun belgede çizilmesi nedeniyle vardır; milyon satırlık bir tablo ise tarayıcıyı gerçekten durduran şeydir.
Yüzde kodlaması nedir?

Yüzde kodlaması — URL kodlaması olarak da adlandırılır, eski belgelerde kaçışlama — bir URL'nin içeremediği karakterleri taşımasını sağlayan kuraldır. Bir yüzde kaçışı üç ASCII karakteridir: bir yüzde işareti ve iki onaltılık rakam, bir baytı temsil eder. %20, boşluk olan 0x20 baytıdır. %2F, eğik çizgi olan 0x2F baytıdır. Başka bir şey yoktur: kaçış bir karakteri değil, bir baytı adlandırır.

Metin bayt adlandırdığı için önce baytlara dönüştürülmelidir ve bayt kodlaması UTF-8'dir. Uzun kaçışların kaynağı budur: bir Çince karakter üç UTF-8 baytı ve dolayısıyla üç kaçıştır, bir emoji ise dört bayt ve on iki ASCII karakteridir.

30 saniyelik özet: bir boşluk bir URL değeri olarak %20, ama form verisinde +'dır; # %23'tür; gerçek bir yüzde işareti %25'tir. Bu sayfadaki üç kodlayıcı harfler, rakamlar ve -_. üzerinde anlaşır, yaklaşık on noktalama işaretinde ayrılır — aralarında tilde de vardır. Bu tam olarak encodeURIComponent ile encodeURI'nin aynı metin için neden farklı dizgiler ürettiğinin, ve yanlış olanın bir değeri iki sorgu parametresine bölebilmesinin nedenidir.
Bir URL'nin buna neden ihtiyacı var

Bir URI, ASCII karakterlerin bir dizisi olarak tanımlanır (RFC 3986 bölüm 2.1) ve bu ASCII aralığında bazı karakterler ayrılmıştır: URL'ye yapısını veren noktalama işaretleridir. İki nokta üst üste ve iki eğik çizgi şemayı ayırır, at işareti kullanıcı bilgisini ana bilgisayardan ayırır, soru işareti sorguyu başlatır, diyez parçayı başlatır, ve işareti sorgu parametrelerini ayırır, yüzde işareti ise bir kaçışı başlatır.

Bu, bir sorun ve bir açık yaratır. Sorun: kendisi bu karakterlerden birini içeren bir değer — "a&b" içeren bir arama kutusu, eğik çizgi içeren bir dosya adı, iki nokta üst üste içeren bir parola — aksi halde taşındığı URL'nin yapısını değiştirirdi. Açık: yüzde işaretinin kendisi, yani kodlayıcı kendi alfabesini genişletebilir. % %25 olarak yazılır ve ardından gelen iki onaltılık rakam sıradan ayrılmamış karakterlerdir.

İşlenmiş örnekler

Bunlar, birbirlerinden farklı davranmaları için seçilmiş girdilerde bu sayfanın çalıştırdığı üç kodlayıcının tam çıktılarıdır. Sayfa bunları gözünüzün önünde yeniden hesaplar ve öz-testi her satırı platformun kendi uygulamalarına karşı yeniden denetler.

Üç yöntem ve her birinin ne zaman doğru olduğu

Hataların çoğunu önleyen kısa sürüm: tek bir parametre değerine giden her şey encodeURIComponent'ten geçer (ya da aynı işi farklı bir güvenli kümeyle yapan bir form serileştiricisinden), ve zaten birleştirilmiş tam bir URL, kaçışlanması gerekiyorsa encodeURI'den geçer. Bu ikisinden yanlışını seçmek, web kodunda en yaygın yüzde kodlaması hatasıdır.

Bir URL'nin taşıyabileceği karakterler, tam olarak
İki artı işareti, iki anlam

Bir boşluk, kodlaması metnin nereye gittiğine bağlı olan tek karakterdir ve artı işareti bunun nedenidir.

Tuzak o tablonun ortasında. Form verisinde bir artı işareti boşluk anlamına gelir, bu yüzden gerçekten bir artı işareti içeren bir değer — +44 20 7946 0958 olarak yazılmış bir telefon numarası, bir aritmetik ifade, artı etiketli bir e-posta adresi — %2B olarak taşınmalıdır. Gerçek bir artı işaretiyle taşınırsa alıcı onu boşluk olarak okur ve +44, " 44" olarak gelir.

İki kez kodlanmış ve bunu nasıl tanırsınız

Çift kodlama, bir dizgi zaten kaçışlanmışken bir kez daha kaçışlandığında olur. İlk kaçışın yüzde işareti diğer karakterler gibi bir karakterdir, bu yüzden %25 olur ve altındaki katman görünür metin olarak kalır.

Tanımak bir sayma meselesidir: dizgiyi bir kez çözün ve sonuca bakın. Hâlâ bilerek görünen kaçışlar içeriyorsa — geçerli bir %XX ya da bir boşluk beklenen yerde bir form artı işareti — bir katman daha vardır. %25'in ardından iki onaltılık rakam geliyorsa, bir sonraki katman kesinlikle bir kaçıştır.

İki pratik not. Birincisi, iki kez çözmek zararsız değildir: bir güvenlik filtresinin ve arkasındaki kodun farklı dizgiler görmesinin bilinen bir yoludur, bu yüzden ikinci bir çözmeden önce çalışan bir filtre yanlış metni filtreler. İkincisi, buradaki katman sayısı bir dizginin özelliğidir, niyet hakkında bir vaat değildir: meşru bir değer tek katmanlı olabilir ve bozuk bir değer iki katmanlı olabilir.

Bu sayfanın yakalamak için kurulduğu hatalar
  • encodeURI ile kodlanmış bir değer. Ayraçlar hayatta kalır, bu yüzden & ya da = içeren bir değer diğer tarafta birkaç parametreye bölünür. Bu sayfanın en üstündeki iki sütunu a&b=c girdisinde karşılaştırın: bileşen sütunu her iki karakteri de kaçışlar, encodeURI sütunu bunları tutar.
  • Form verisi olarak gönderilen gerçek bir artı işareti. Bir boşluk olarak gelir. %2B kullanın.
  • "Güvenli olsun diye" iki kez kaçışlanmış bir değer. Daha güvenli değildir. Alıcı bir kez çözer ve hâlâ yüzde kaçışları içeren bir dizgi alır; bu, bir karakter kümesinin yanlış olmasıyla aynı arıza, bir katman aşağıda.
  • Hiç kodlanmamış bir şeyi çözmek. Metindeki gerçek bir yüzde işareti — 100% sure — bir kaçış değildir. Katı okumada bozuk bir kaçıştır, bu sayfanın bildirdiği konumda; gevşek okumada ise yaşar, bu yüzden buradaki varsayılan gevşektir, tersi değil.
  • Kaçışın büyük harf olması gerektiğini varsaymak. Çözme %2f ile %2F'yi aynı bayt olarak ele alır ve ikisi de geçerlidir. Büyük harf, RFC 3986'nın önerdiği ve diğer araçların üreteceği kanonik yazımdır.
  • Yüzde kodlamasının metni güvenli yaptığını varsaymak. Metni bir URL içinde belirsiz olmaktan çıkarır. Enjeksiyonu durdurmaz, şifreleme değildir ve bir temizleyici de değildir: kaçış, metnin gireceği bağlam için birleştirmeden hemen önceki son adım olmalıdır.
Hızlı yanıtlar

“Bir URL'de artı işareti bir boşluk mudur?”

Yalnızca form verisinde ve bir form gönderiminin sorgu kısmında. Bir yolda, bir parçada ve düz bir bağlantının sorgusunda bir artı işareti gerçek bir artı işaretidir. Bu yüzden bu sayfada tahmin etmek yerine bunun için bir anahtar vardır.

“Bağlantım neden %25 gösteriyor?”

Çünkü bir yüzde işaretini bir şey kodlamıştır. Ya düz bir yüzde işareti bir kodlayıcıdan geçmiştir — 100% sure 100%25%20sure olur — ya da zaten bir kaçış içeren bir dizgi ikinci kez kodlanmıştır. Dizgiyi bir kez çözün ve geri gelen şeye bakın: sonuç hâlâ %XX içeriyorsa, bir katman daha vardır.

“Bir sorgu değerinin içindeki bir eğik çizginin %2F mi yoksa / mi olduğu önemli mi?”

URL ayrıştırıcısına göre hayır: ikisi de sunucuya bir eğik çizgi olarak ulaşır ve WHATWG sorgu kümesi bir eğik çizgiyi olduğu gibi bırakır. Birlikte çalışabilirliğe göre bazen evet: birçok sunucu çatısı ham bir sorgu dizgisi üzerinde kendi çözmesini çalıştırır ve bazıları hiç kaçışlanmamış karakterler konusunda hemfikir değildir. Bir değer serileştirici yerine elle birleştirildiğinde, ayrılmış karakterleri açıkça kaçışlamak daha güvenli bir alışkanlıktır.

“Form sütunu, diğer ikisinin dokunmadığı bir tildeyi neden kaçışlıyor?”

Çünkü form kodlayıcısının güvenli kümesi daha dardır: yalnızca harfler, rakamlar ve -_.*. WHATWG form kodlayıcısı, RFC 3986'nın ~'u ayrılmamış saymasına rağmen ~ ! ' ( ) karakterlerini kaçışlar. İki yazım da aynı değere çözülür; fark yalnızca dizgileri bayt bayt karşılaştırırken önemlidir.

“Aynı karakterler bir tarayıcı adres çubuğunda kaçışlanmadan görünebilir mi?”

Evet, ve bu adres çubuğudur, URL'nin kendisi değil. Tarayıcılar bir URL'nin okunabilir biçimini gösterir ve gönderirken kodlar; bu yüzden bir bağlantıdaki 中文 kablo üzerinde %E4%B8%AD%E6%96%87 olur. URL'yi adres çubuğundan kopyalarsanız, tarayıcıya bağlı olarak iki biçimden birini alabilirsiniz.

“Buradaki her kaçış geçerli görünüyor, ama çıkan karakter beklediğim değil. Neden?”

"Yanlış çözüldü" ifadesinin arkasında iki farklı arıza gizlidir ve bu sayfa bunları farklı bildirir. Birincisi bozuk bir kaçış: iki onaltılık rakamla izlenmeyen bir yüzde işareti, örneğin sondaki bir 100% ya da bir %zz. Bu bir sözdizimi sorunudur; katı okuma bunu reddeder ve nerede olduğunu söyler, gevşek okuma ise onu düz metin olarak tutar ve listeler. İkincisi, baytı kusursuz yasal ama baytları geçerli bir UTF-8 karakteri yazmayan bir kaçış, örneğin tek başına %FF ya da yarıda kesilmiş üç baytlık bir karakter %E4%B8. Bu bir sözdizimi sorunu değildir, bu yüzden her iki okuma da metni döndürür, çözülemeyen baytları değiştirme karakteri U+FFFD ("�") ile değiştirir ve bunu söyleyen bir uyarı listeler. Bu uyarı faydalı olandır: değiştirme karakterleri olarak gelen metin genellikle gönderenin farklı bir karakter kümesi kullandığı ya da dizginin bir kez fazla kaçışlandığı anlamına gelir. Yüzde kodlaması baytları adlandırır ve bu sayfa, URL standardı gibi, bu baytları her zaman UTF-8 olarak okur.

“Bu sayfa ne yapmaz?”

URL'yi şema, ana bilgisayar, yol ve sorguya ayırmaz — bunun için URL Ayrıştırıcı vardır. Bir bağlantının açmanın güvenli olup olmadığını denetlemez, hiçbir şeyle iletişim kurmaz ve bir kaçışın arkasındaki baytların karakter kümesini tahmin etmez: onları her zaman UTF-8 olarak okur, URL standardının gerektirdiği budur.

“Çözme hangi yedeği gerektirir ve doğru olduğunu nasıl bilirim?”

Öz-test'e basın. Sayfanın kendi kodlayıcılarını her yazdırılabilir ASCII karakter için platformun encodeURIComponent, encodeURI ve URLSearchParams'ıyla karşılaştırır, yukarıdaki tablolardaki her örneği yeniden çalıştırır ve kayıtlı katman zincirlerini yeniden denetler, ardından denetim sayısını burada raporlar.

Standartlar ve kapsam

Yüzde kodlaması RFC 3986 bölüm 2.1'de tanımlanmıştır; ayrılmış ve ayrılmamış karakterlerin tanımı bölüm 2.2 ve 2.3'te, büyük/küçük harf kuralı bölüm 6.2.2.1'dedir. Bir tarayıcının bir URL oluştururken gerçekten kullandığı kümeler WHATWG URL Standardı'ndadır; bunlar bağlama göre bölünür: bir parça için bir küme, bir sorgu için bir küme, özel bir sorgu için bir küme, bir yol için bir küme, kullanıcı bilgisi için bir küme ve tek bir bileşen için kullanılan daha dar küme. Artı işareti dahil form gönderimi HTML Standardı'nda application/x-www-form-urlencoded altındadır. encodeURI ve encodeURIComponent fonksiyonları ECMAScript'in kendisinin parçasıdır.

Bu sayfa yol, sorgu ve parça sütunlarını kendi bağlama özgü kümelerinden doldurur ve her bağlam için tam listeyi sonucun yanındaki kutuda yazdırır. Bu kümeler WHATWG'den türetilmiştir ve iki kasıtlı yerde farklılaşır: bir karma sorgu içinde kaçışlanır, çünkü ham bir karma parçayı başlatırdı; ve bileşen kümesi tam olarak encodeURIComponent'in kaçışladığı karakterlere sabitlenmiştir. Bir platform fonksiyonunun cevabın tanımı olduğu yerde — encodeURIComponent, encodeURI ve form serileştirmesi — o fonksiyon doğrudan çağrılır, bu yüzden o sütunlar onun yeniden uygulaması değil, tarayıcının kendi davranışıdır.

Sayfa metni bu site için yazılmıştır. Yukarıdaki tablolardaki her değer, sayfanın kendi kodu tarafından yüklenme anında üretilir ve bu sitenin test araçlarında platformun uygulamalarına karşı doğrulanmıştır; öz-test bu karşılaştırmayı tarayıcınızda yineler.