Bir html alanı% 20 yerine% 2520 olarak görünüyor


110

Firefox tarayıcıya bir dosya adı geçirmemiz boşlukların yerine neden %2520 yerine %20.

Adlı bir dosyada aşağıdaki HTML var myhtml.html:

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

myhtml.htmlFirefox'a yüklediğimde , görüntü bozuk bir görüntü olarak görünüyor. Bu yüzden resmi görüntülemek için bağlantıya sağ tıklıyorum ve bu değiştirilmiş URL'yi gösteriyor:

file:///c:/Documents%2520and%2520Settings/screenshots/Image01.png
                    ^
                    ^-----Firefox changed my space to %2520.

Ne halt? Alanımı bir %2520. Bunu a'ya çevirmesi gerekmez %20mi?

Tarayıcının resmimi bulabilmesi için bu HTML dosyasını nasıl değiştirebilirim? Burada neler oluyor?

Yanıtlar:


219

Bunun ne olduğuna dair biraz açıklama %2520:

Ortak boşluk karakteri %20sizin belirttiğiniz gibi kodlanır . %Karakter olarak kodlanmıştır %25.

Alacağınız yolu %2520Url'nizde zaten sahip olduğunda ise %20o ve dönüşümleri, hangi yine urlencoded alır %20için %2520.

Siz (veya kullanıyor olabileceğiniz herhangi bir çerçeve) çift kodlama karakterleri misiniz?

Düzenleme: Bu, özellikle LOCAL bağlantılar için biraz genişletiliyor . Kaynağa bağlanmak istediğinizi varsayarsak C:\my path\my file.html:

  • Yalnızca yerel bir dosya yolu sağlarsanız, tarayıcının verilen tüm karakterleri kodlaması ve koruması beklenir (yukarıda gösterildiği gibi boşluk bırakmalısınız çünkü % geçerli bir dosya adı karakteri olduğundan ve bu nedenle kodlanacaktır) uygun bir URL'ye (sonraki noktaya bakın).
  • file://Protokol ile bir URL sağlarsanız , temel olarak tüm önlemleri aldığınızı ve kodlanması gerekenleri kodladığınızı belirtirsiniz, geri kalanı özel karakterler olarak ele alınmalıdır. Yukarıdaki örnekte, bu nedenle sağlamalısınız file:///c:/my%20path/my%20file.html. Eğik çizgileri düzeltmenin yanı sıra istemciler burada karakterleri kodlamamalıdır.

NOTLAR:

  • Eğik çizgi yönü - eğik çizgi /URL'lerde, \Windows yollarında ters eğik çizgi kullanılır , ancak çoğu istemci, bunları uygun eğik çizgiye dönüştürerek her ikisiyle de çalışır.
  • Ek olarak, uzak bir ana bilgisayar yerine sessizce mevcut makineye atıfta bulunduğunuz için protokol adından sonra 3 eğik çizgi vardır (kısaltılmamış yolun tamamı olur file://localhost/c:/my%20path/my%file.html), ancak çoğu istemci ana bilgisayar parçası olmadan çalışacaktır (yani yalnızca iki eğik çizgi) ) yerel makineyi kastettiğinizi varsayarak ve üçüncü eğik çizgiyi ekleyerek.

1
Hexblot aslında burada doğrudur. Genellikle bu, url’lerinizi programlama yoluyla kodladığınızda ve bir bot gelip ikinci kez kodladığında gerçekleşir. Botların bunu yapma konusunda kötü bir alışkanlığı var. Bu sorunu halledebileceğiniz iki tane vardı. 1) 404 veya 401'i bir deneme yakalama istisnası ile yapabilir veya iş mantığı için başka bir yönteme devretmeden önce çift kodu çözülmüş değerleri çözecek küçük bir işlev yazabilirsiniz.
Ryan Watts

Bu, jQuery ajax isteği gönderirken neden aldığımı anlamama yardımcı oldu. Bir ajax GET isteğindeki data özniteliğini değer üzerinde encodeURIComponent işlevi ile ayarlıyordum, ancak jQuery bunu zaten varsayılan olarak yapıyor, bu yüzden neden% 2520 alıyordum. Gerçekten yardımcı oldu, teşekkürler.
Asher

Chrome'un bağlantıyı yorumlayıp yorumlamadığını söylemesi için bir komut satırı argümanı yok mu?
AleX_

Ben http://mysite/test & that... If I use o dönüşür UrlEncode` http://mysite/test%20&%20thatama ben de istiyorum &yanı böylece% 26 değiştirmek için bu en mysite / test% 20% 20that% 26 `Bunu nasıl yapabilirim?
Si8

10

Bazı - muhtemelen geçerli - nedenlerden dolayı url iki kez kodlanmıştır. %25urlencoded %işarettir. Yani orijinal url şöyle görünüyordu:

http://server.com/my path/

Sonra bir kez urlencoded edildi:

http://server.com/my%20path/

ve iki kez:

http://server.com/my%2520path/

Öyleyse , sizin durumunuzda , diğer bileşenler zaten sizin için öyle göründüğü için, urlencoding yapmamalısınız . Sadece bir boşluk kullanın


Aynı sorunu yaşıyorum, ancak varsayılan urlencoding neden ilk seferde iki kez işlendiğini anlamıyorum.
jungwon jin

Duruma bağlı olarak, çift kodlama, kodlamayı doğru kullanmanın mükemmel bir sonucu olabilir. Bu cevap, çift kodlamanın her zaman yanlış olduğu ve "çalışmasını sağlamak" için gerektiği kadar çok kodlama / kod çözme çağrısı ekleyerek kodlama sorunlarını çözebileceğiniz izlenimini yaratabilir. Bu yanlış ve kodlama hataları ilk etapta bu şekilde ortaya çıkıyor. -1
Florian Winter

@FlorianWinter Bunu satırlar arasında nerede okuduğunuzu gerçekten göremiyorum. Bana yardım edebilir misin? (Lütfen soruyu ve cevabımı okuyunuz)
hek2mgl

7

Firefox tarayıcısı aracılığıyla yerel bir dosya adını ziyaret etmeye çalışırken, file:\\\protokolü ( http://en.wikipedia.org/wiki/File_URI_scheme ) zorlamanız gerekir, aksi takdirde firefox alanınızı İKİ KEZ kodlar. HTML snippet'ini bundan değiştirin:

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

buna:

<img src="file:\\\C:\Documents and Settings\screenshots\Image01.png"/>

veya bu:

<img src="file://C:\Documents and Settings\screenshots\Image01.png"/>

Ardından firefox'a bunun yerel bir dosya adı olduğu bildirilir ve görüntüyü tarayıcıda doğru şekilde oluşturur, dizeyi bir kez doğru kodlar.

Yararlı bağlantı: http://support.mozilla.org/en-US/questions/900466


0

Aşağıdaki kod parçası sorunumu çözdü. Bunun başkaları için yararlı olabileceğini düşündüm.

var strEnc = this.$.txtSearch.value.replace(/\s/g, "-");
strEnc = strEnc.replace(/-/g, " ");

Aksine varsayılan kullanarak encodeURIComponentkod benim ilk hat tüm dönüştürmektedir spacesiçine hyphensregex deseni kullanarak /\s\gve aşağıdaki satırı sadece tersini yapar, yani tüm dönüştürür hyphensiçin geri spacesbaşka kullanarak regex pattern /-/g. İşte /gasıl sorumlusunun finding alleşleşen karakterleri.

Bu değeri Ajax çağrıma gönderdiğimde, olarak normal spacesveya basitçe dolaşır %20ve böylece kurtulur double-encoding.


1
Sanırım meseleyi çözmüyorsunuz, sadece örtbas ediyorsunuz - kök neden hala orada bir yerde ve çift iş yapıyorsunuz (bir yerde yanlışlıkla iki kez kodluyorsunuz ve başka bir yerde, örtmek için manuel olarak kod çözüyorsunuz yukarı). İşleri "düzgün" yapmak istediğinizi varsayarsak, en iyi şey hata ayıklamak ve gerçek suçluyu bulmaktır.
Nick Andriopoulos

Aslında çözüm, bu sorunu yaşadığım her yerde benim için çalıştı. Ben de gönderdim.
Subrata Sarkar

2
@NiladriSarkar, hexbolt'un söylemeye çalıştığı şey, kodunuz çalışırken geçerli bir çözüm değil, kirli bir düzeltme ve kaçınılması gerektiğidir ...
2Ekim

-1

Bunu dene?

encodeURIComponent('space word').replace(/%20/g,'+')


1
StackOverflow'a hoş geldiniz! Yalnızca bir kod parçacığı yerine, önerinizin neden OP sorununu çözeceğine ilişkin bazı açıklamalar içeriyorsa, yanıtlar genellikle daha kullanışlıdır. Ayrıca, bu sorunun zaten kabul edilmiş bir cevabı olduğundan, cevabınızın neden bundan daha doğru olduğuna dair bazı açıklamalar eklemek iyi bir fikir olacaktır.
DaveyDaveDave
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.