Bir URL'deki boşluk +
ne zaman ve ne zaman kodlanır %20
?
Bir URL'deki boşluk +
ne zaman ve ne zaman kodlanır %20
?
Yanıtlar:
Gönderen Wikipedia (vurgu ve bağlantı eklendi):
HTML formlarına girilen veriler gönderildiğinde, form alanı adları ve değerleri kodlanır ve sunucuya GET veya POST yöntemi kullanılarak veya geçmişte e-posta yoluyla bir HTTP istek iletisinde gönderilir. Varsayılan olarak kullanılan kodlama, genel URI yüzde kodlama kurallarının çok erken bir sürümüne dayanır ; satırsonu normalizasyonu ve boşlukların yerine "% 20" yerine "+" ile bir dizi değişiklik yapılır . Bu şekilde kodlanan MIME türü application / x-www-form-urlencoded şeklindedir ve şu anda HTML ve XForms belirtimlerinde tanımlanmıştır (hala çok eski bir şekilde).
Dolayısıyla, URL'lerde form verileri kullanan değiştirilmiş bir formdayken gerçek kodlama yüzdesi %20
kullanılır +
. Bu nedenle, büyük olasılıkla yalnızca +
bir ?
.
multipart/form-data
MIME kodlamasını kullanır; application/x-www-form-urlencoded
kullanır +
ve uygun şekilde kodlanmış URI kullanır %20
.
http://www.bing.com/search?q=hello+world
ve adında boşluk olan bir kaynakhttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
mailto:support@example.org?subject=I%20need%20help
,. Bunu + ile denediyseniz, e-posta boşluk yerine + es ile açılır.
Bu karışıklık, URL'lerin bugüne kadar hala 'kırılmış' olmasıdır.
Örneğin " http://www.google.com " adresini ele alalım . Bu bir URL. URL, Tekdüzen Kaynak Konum Belirleyicisidir ve gerçekten bir web sayfasına (çoğu durumda) bir işarettir. URL'ler aslında 1994'teki ilk spesifikasyondan bu yana çok iyi tanımlanmış bir yapıya sahiptir.
" Http://www.google.com " URL'si hakkında ayrıntılı bilgi edinebiliriz :
+---------------+-------------------+
| Part | Data |
+---------------+-------------------+
| Scheme | http |
| Host | www.google.com |
+---------------+-------------------+
Aşağıdaki gibi daha karmaşık bir URL'ye bakarsak:
" https: // bob: bobby@www.lunatech.com: 8080 / dosya; p = 1? q = 2 # üçüncü "
aşağıdaki bilgileri elde edebiliriz:
+-------------------+---------------------+
| Part | Data |
+-------------------+---------------------+
| Scheme | https |
| User | bob |
| Password | bobby |
| Host | www.lunatech.com |
| Port | 8080 |
| Path | /file;p=1 |
| Path parameter | p=1 |
| Query | q=2 |
| Fragment | third |
+-------------------+---------------------+
https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/ \_/ \___/ \______________/ \__/\_______/ \_/ \___/
| | | | | | \_/ | |
Scheme User Password Host Port Path | | Fragment
\_____________________________/ | Query
| Path parameter
Authority
Ayrılmış karakterler her bölüm için farklıdır.
HTTP URL'leri için, yol parçası bölümündeki bir boşluk "% 20" olarak kodlanmalıdır (kesinlikle "+" değil), yol parçası bölümündeki "+" karakteri ise kodlanmamış olarak bırakılmalıdır.
Şimdi sorgu bölümünde, boşluklar "+" (geriye dönük uyumluluk için: URI standardında aramaya çalışmayın) veya "% 20" veya "+" karakteri (bu belirsizliğin sonucu olarak) olarak kodlanabilir. ) "% 2B" değerine kaçmalıdır.
Bu, "mavi + açık mavi" dizesinin yol ve sorgu bölümlerinde farklı şekilde kodlanması gerektiği anlamına gelir:
" http://example.com/blue+light%20blue?blue%2Blight+blue ".
Buradan, tamamen yapılandırılmış bir URL'yi kodlamanın, URL yapısının sözdizimsel farkındalığı olmadan imkansız olduğunu çıkarabilirsiniz.
Bu kaynar:
Sen olmalıdır %20
önce ?
ve +
sonra.
key1=value1&key1=value2
anahtarların ve değerlerin kurallara uygun olarak kodlandığı yerlerde kullanır , encodeURIComponent
ancak sorgu bölümünün içeriği tamamen% 100'e kadar AFAIK'dir. Diğer o zaman sadece #
resmi kodlama yok ilk gider .
Ben tavsiye ederim %20
.
Onları kodlamakta zorlanıyor musunuz?
Yine de bu, diller arasında çok tutarlı değil. Yanılmıyorsam, PHP'de urlencode()
boşlukları +
Python'ın urlencode()
onlara davranır gibi davranır %20
.
DÜZENLE:
Yanılıyor gibiyim. Python'lar urlencode()
(en azından 2.7.2'de) quote_plus()
yerine quote()
"+" yerine kullanır ve kodlar. Ayrıca, W3C önerisinin şu şekilde olduğu gibi "+" olduğu anlaşılıyor: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
Ve aslında, boşlukları kodlamak için ne kullanacağınız konusunda Python'un kendi sorun izleyicisindeki bu ilginç tartışmayı takip edebilirsiniz: http://bugs.python.org/issue13866 .
DÜZENLEME # 2:
"" Kodlamanın en yaygın yolunun "+" olduğunu anlıyorum, ama sadece bir not, sadece ben olabilirim, ama bunu biraz kafa karıştırıcı buluyorum:
import urllib
print(urllib.urlencode({' ' : '+ '})
>>> '+=%2B+'
URLEncoder.encode()
Java'daki yöntem de onu dönüştürür +
.
Bir boşluk, yalnızca bir URL'nin "application / x-www-form-urlencoded" içerik türü anahtar / değer çiftleri sorgu bölümünde "+" olarak kodlanabilir. Bence bu bir MAYIS, bir zorunluluk değil. Diğer URL'lerde% 20 olarak kodlanır.
Kanımca, boşlukları bir URL'nin sorgu bölümünde bile her zaman "+" olarak değil,% 20 olarak kodlamak daha iyidir, çünkü boşluk karakterlerinin " + "in" application / x-www-form-urlencoded "içerik türü anahtar / değer çiftleri (bkz. paragraf 8.2.1. alt paragraf 1)
Form verilerini kodlamanın bu yolu, daha sonraki HTML spesifikasyonlarında da verilmiştir. Örneğin, HTML 4.01 Spesifikasyonu'nda application / x-www-form-urlencoded ile ilgili paragrafları arayın, vb.
URL spesifikasyonunun boşlukları artı olarak kodlamasına izin verdiği örnek bir URL dizesi: " http://example.com/over/there?name=foo+bar ". Yani, sadece "?" Dan sonra, boşluklar artılarla değiştirilebilir . Diğer durumlarda, boşluklar% 20 olarak kodlanmalıdır. Ancak bağlamı doğru bir şekilde belirlemek zor olduğundan, boşlukları asla "+" olarak kodlamamak 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 / "-" / "." / "_" / "~"
Uygulama, seçtiğiniz programlama diline bağlıdır.
URL'niz ulusal karakterler içeriyorsa, önce bunları UTF-8 olarak kodlayın ve ardından sonucu yüzde olarak kodlayın.