Bazen boşluklar URL'yi +
işarete, bazen de kodlanır %20
. Fark nedir ve bu neden gerçekleşmelidir?
Bazen boşluklar URL'yi +
işarete, bazen de kodlanır %20
. Fark nedir ve bu neden gerçekleşmelidir?
Yanıtlar:
+
Bir boşluk anlamına yalnızca içinde application/x-www-form-urlencoded
böyle bir URL sorgu parçası olarak içerik:
http://www.example.com/path/foo+bar/path?query+name=query+value
Bu URL'ye, parametre adıdır query name
boşlukla ve değer query value
boşlukla, ancak yolun klasör adı anlamıyla foo+bar
, değil foo bar
.
%20
bu bağlamlardan herhangi birinde bir boşluğu kodlamanın geçerli bir yoludur. Dolayısıyla, bir URL'nin bir kısmına eklenmek üzere bir dizeyi URL olarak kodlamanız gerekiyorsa, boşlukları %20
ve artılarını değiştirmek her zaman güvenlidir %2B
. Örneğin budur. encodeURIComponent()
JavaScript'te yapar. Ne yazık ki PHP'de urlencode ne yapar ( rawurlencode daha güvenlidir).
Ayrıca Bkz. HTML 4.01 Belirtim uygulaması / x-www-form-urlencoded
query+name=query+value
ile bir formdan bir parametre oluşturur <input name="query name" value="query value">
. Bu oluşturmayacaktır query%20name
bir formdan, ancak, bunun yerine örneğin o kullanmak tamamen güvenlidir. form gönderimi için bir araya getiriyorsanız XMLHttpRequest
. İçinde boşluk olan bir URL'niz varsa <a href="http://www.example.com/foo bar/">
, tarayıcı, %20
hatayı düzeltmeniz için bunu kodlar , ancak muhtemelen en iyisi buna güvenilmez.
foo bar
için foo+bar
?
encodeURIComponent(s).replace(/%20/g, '+')
Gerçekten ihtiyacınız varsa doğal olarak yapabilirsiniz+
http://www.example.com/some/path/to/resource?param1=value1
Soru işaretinden önceki kısım% kodlamasını ( %20
boşluk için) kullanmalıdır, soru işaretinden sonra boşluk için ya %20
da +
boşluk için kullanabilirsiniz . +
Soru işaretinden sonra bir gerçek gerekiyorsa kullanın %2B
.
decodeURIComponent
kodunu çözmez.
+
bir olduğunu ayrılmış bir karakterdir tarayıcı tarafından korunacaktır.
+
varsayılan olarak deşifre eder ( { foo: 'bar bar'}.to_query
=> foo=bar+bar
)
Yani, buradaki cevaplar biraz eksik. URL'lerde bir boşluğu kodlamak için '% 20' kullanılması , bir URI'nin nasıl oluşturulduğunu tanımlayan RFC3986'da açıkça tanımlanmıştır . Bu kodlama alanlarını kodlamak için bir '+' kullanma belirtiminden söz edilmez - yalnızca bu spesifikasyona göre giderseniz, bir boşluk '% 20' olarak kodlanmalıdır.
Boşlukları kodlamak için '+' kullanımından bahsedilmesi, HTML spesifikasyonunun çeşitli enkarnasyonlarından gelir - özellikle 'application / x-www-form-urlencoded' içerik türünü açıklayan bölümde. Bu, form verilerini göndermek için kullanılır.
Şimdi, HTML 2.0 Spesifikasyonu (RFC1866) , bölüm 8.2.2'de , bir GET isteğinin URL dizesinin Sorgu bölümünün 'application / x-www-form-urlencoded' olarak kodlanması gerektiğini açıkça belirtti. Bu, teorik olarak, sorgu dizesindeki ('?' İşaretinden sonra) URL'de '+' kullanmanın yasal olduğunu gösterir.
Ama ... gerçekten mi? HTML'nin kendisinin bir içerik spesifikasyonu olduğunu ve sorgu dizelerine sahip URL'lerin HTML dışındaki içerikle kullanılabileceğini unutmayın. Ayrıca, HTML spesifikasyonunun sonraki sürümleri 'application / x-www-form-urlencoded' içeriğinde '+' kodunu yasal olarak tanımlamaya devam ederken, GET istek sorgusu dizelerinin bu tür olarak tanımlandığını söyleyen bölümü tamamen atlarlar. Aslında, HTML 2.0 spesifikasyonundan sonra herhangi bir şeyde sorgu dizesi kodlaması hakkında herhangi bir söz yoktur.
Hangisi bizi şu soruya bırakır - geçerli mi? Kesinlikle sorgu dizelerinde '+' destekleyen bir çok eski kod ve onu da üreten bir sürü kod vardır. '+' Kullanırsanız oranlar iyi olmaz. (Ve aslında, son zamanlarda bu konuda tüm araştırmaları yaptım çünkü bir GET sorgusunda '% 20' yi boşluk olarak kabul etmeyen büyük bir site keşfettim. Aslında yüzde kodlanmış karakterin kodunu çözemediler. kullanmanız da alakalı olabilir.)
Ancak, spesifikasyonların saf bir şekilde okunmasıyla, HTML 2.0 spesifikasyonunun dili daha sonraki sürümlere taşınmadan, URL'ler tamamen RFC3986 tarafından kapsanır, bu da boşlukların '% 20'ye dönüştürülmesi gerektiği anlamına gelir. Ve kesinlikle bir HTML belgesi dışında bir şey talep ediyorsanız durum böyle olmalıdır.
%20
( <a href="?q=a b">
) olarak kodlar , ancak bir form gönderdiğinizde +
işareti kullanır . Bunu açıkça +
( <a href="?q=a+b">
) işaretini kullanarak veya formu kullanarak göndererek geçersiz kılabilirsiniz XMLHTTPRequest
.
Boşlukları her zaman "+" olarak değil,% 20 olarak kodlamak daha iyidir.
Boşluk karakterlerinin "application / x-www-form-urlencoded" içerik türü anahtar / değer çiftlerinde "+" olarak kodlanması gerektiğini belirten RFC-1866 (HTML 2.0 belirtimi) idi. (bakınız paragraf 8.2.1. alt paragraf 1). Form verilerini kodlamanın bu yolu daha sonraki HTML spesifikasyonlarında da verilmiştir, application / x-www-form-urlencoded ile ilgili paragrafları arayın.
URL'de böyle bir dizeye örnek olarak RFC-1866'nın boşlukları artı olarak kodlamaya izin verdiği bir örnek verilmiştir: "http://example.com/over/there?name=foo+bar". Bu nedenle, RFC-1866'ya göre sadece "?" İşaretinden sonra boşluklar artılarla değiştirilebilir. Diğer durumlarda, boşluklar% 20 olarak kodlanmalıdır. Ancak bağlamı belirlemek zor olduğundan, boşlukları asla "+" olarak kodlamak en iyi uygulamadır.
RFC-3986, s.2.3'te tanımlanan "rezerve edilmemiş" dışındaki tüm karakterlerin yüzde olarak kodlanmasını öneririm
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Fark nedir: Diğer cevaplara bakın.
Kullandığınızda +
yerine %20
? Herhangi bir +
nedenle, URL sorgu dizesini ( ?.....
) veya karma parçasını ( #....
) daha okunabilir hale getirmek istiyorsanız kullanın . Örnek: Aslında bunu okuyabilirsiniz:
https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces
( %2B
= +)
Ama aşağıdakileri okumak çok daha zor: (en azından benim için)
+
Google kullandığından +
(yukarıdaki 1. bağlantıya bakın) ve muhtemelen bunu düşündüklerinden , herhangi bir şeyi kırmanın olası olmadığını düşünürdüm. +
Kendimi sadece okunabilir + Google'ın uygun olduğunu düşündüğü için kullanacağım .