Bir URL şemasındaki / ana makine / yoldaki `+` bir alanı temsil ediyor mu?


224

+Bir URL sorgu dizesindeki bir alanı temsil ettiğinin farkındayım . Sorgu dizesi bölgesinin dışında da durum böyle mi? Yani, aşağıdaki URL'yi yapar:

http://a.com/a+b/c

aslında temsil:

http://a.com/a b/c

(ve eğer gerçekten a olması gerekiyorsa kodlanmalıdır +) ya da gerçekten temsil eder a+b/cmi?



4
Php urldecode% 2b (kodlanmış +) bir boşluğun kodunu çözer. Bu kullanımdan kaçınmak için rawurldecode. Burada referans için bunu söylüyorum, çünkü bu "php url kod çözme sonları artı sembolü" için google aramada yüksek puan alan bir sonuçtur.
danielson317

Yanıtlar:


170
  • Bir URL'nin yol bölümündeki yüzde kodlamasının kodunun çözülmesi bekleniyor, ancak
  • +yol bileşenindeki tüm karakterlerin tam anlamıyla işlem görmesi beklenir.

Açık olmak gerekirse: +yalnızca sorgu bileşenindeki özel bir karakterdir.


12
+1 Ne yazık ki, vahşi doğada birçok "URL kodlayıcı / kodlayıcı" bunu anlamıyor. Örn sislands.com/coin70/week6/encoder.htm keyone.co.uk/tools-url-encoder.asp meyerweb.com/eric/tools/dencoder
leonbloy

11
@Stobor: alıntı gerekli.
bukzor

8
@Stobor RFC, +karakterin sorgu bileşeninde boşluk olarak yorumlandığını hiç ifade etti mi? Yoksa basitçe "vahşi" bir kural mı?
Pacerier

44
@Pacerier ve @bukzor: RFC 1738 (2396 ve 3986 tarafından değiştirildiği gibi), scheme ( http:), authority ( //server.example.com) ve path ( /myfile/mypage.htm) bileşenlerini tanımlar ve +karakter için herhangi bir özel anlam tanımlamaz . HTML spesifikasyonu, "RFC1738'deki boşlukları ve diğer özel karakterleri değiştir" olarak tanımlanan mime tipi application / x-www-form-urlencoded olarak sorgu bileşenini tanımlar +. Yani "vahşi" değil, kabul edilmiş (RFC olmayan) bir standart.
Stobor

2
.NET yöntemi, Server.UrlEncodeboşlukları yanlışlıkla yol bölümünde artılar olarak kodlar ve HTTP kurallarını ihlal eder.
Suncat2000

243

W3Schools'ta karşılık gelen URL kodlu karakterlerin güzel bir listesini bulabilirsiniz .

  • + olur %2B
  • alan olur %20

18
Değişmez '+' karakterlerin bir URL'deki yol bileşeninde görünmesi tamamen yasaldır .
Sam Stainsby

4
Arka uçtan (veya en azından PHP'den) bir değişmez + almak için üçlü kodlanmış olması gerekir:%25252B
Şemsiye

11
Bu cevap soru ile tamamen alakasız.
Nisse Engström

22

Boşluk karakterleri yalnızca bir bağlamda "+" olarak kodlanabilir: application / x-www-form-urlencoded anahtar / değer çiftleri.

RFC-1866 (HTML 2.0 özellikleri), paragraf 8.2.1. altparagraf 1. diyor ki: "Form alanı adları ve değerleri kaçıyor: boşluk karakterleri` `+ '' ile değiştiriliyor ve sonra ayrılmış karakterler kaçıyor").

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, yalnızca "?" Karakterinden sonra boşluklar artılarla değiştirilebilir (diğer durumlarda, boşluklar% 20 olarak kodlanmalıdır). Form verilerini kodlamanın bu yolu, daha sonraki HTML spesifikasyonlarında da verilir; örneğin, HTML 4.01 Spesifikasyonu'ndaki application / x-www-form-urlencoded ile ilgili paragrafları arayın, vb.

Ancak, içeriği her zaman 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 "kaydedilmemiş" dışındaki tüm karakterlerin yüzde olarak kodlanması daha iyidir. Neyin kodlanması gerektiğini gösteren bir kod örneği. Delphi (pascal) programlama dilinde verilir, ancak sahip olduğu dilden bağımsız olarak herhangi bir programcı için nasıl çalıştığını anlamak çok kolaydır:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *)
function UrlEncodeRfcA(const S: AnsiString): AnsiString;
const    
  HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF';
var
  I: Integer;
  c: AnsiChar;
begin
 // percent-encoding, see RFC-3986, p. 2.1
  Result := S;
  for I := Length(S) downto 1 do
  begin
    c := S[I];
    case c of
      'A' .. 'Z', 'a' .. 'z', // alpha
      '0' .. '9',             // digit
      '-', '.', '_', '~':;    // rest of unreserved characters as defined in the RFC-3986, p.2.3
      else
        begin
          Result[I] := '%';
          Insert('00', Result, I + 1);
          Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)];
          Result[I + 2] := HexCharArrA[Byte(C) and $F];
        end;
    end;
  end;
end;

function UrlEncodeRfcW(const S: UnicodeString): AnsiString;
begin
  Result := UrlEncodeRfcA(Utf8Encode(S));
end;

0

url'yi düzeltmek için encodeURIComponent işlevini kullanın, Tarayıcı ve node.js üzerinde çalışır

res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));


> encodeURIComponent("http://a.com/a+b/c")
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc'

1
Bu soruya değinmez. URL'leri yanlış bir şekilde belirli bir dille (JavaScript) yanlış kodlar - bağlama bağlı olarak, URL'nin çalışması için muhtemelen özel (gerçek olmayan) eğik çizgilere (/) ve iki nokta üst üste işaretlerine (:) ihtiyaç duymak istemezsiniz. .
Gremio

Teşekkürler gerçekten bana yardımcı oldu!
qwsd

-2

Aşağıdan deneyin:

<script type="text/javascript">

function resetPassword() {
   url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
    return escape(str).replace( "+", "%2B" );
}
</script>

2
İki kişinin bu cevaba oy vermesi çok garip geliyor. Kelimenin tam anlamıyla soruyla hiçbir ilgisi yok.
Andrew Barber

1
Diğer karakterlere ne dersiniz * @ - _ +. /
Ravi

1
@AndrewBarber Neden alakasız buldunuz? +% 2B olur
Java Guy

Bu birçok nedenden dolayı yanlıştır ... escapekullanımdan kaldırılmıştır, bunun yerine encodeURIveya sorgu kısmı kullanmanız gerekir encodeURIComponent. Ayrıca parametre dizesi w3c'ye göre kodlanmalıdır .
Christoph

-5

URL'leri her zaman kodlayacaksınız.

Ruby URL'nizi şu şekilde kodlar:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"

8
Bunun doğru olduğundan emin değilim. RFC2396'ya ( ietf.org/rfc/rfc2396.txt ) göre, artılar URI'nin yolunda (segmentleri) ayrılmış karakterler değil, yalnızca sorgu bileşenidir. Bu, URL kodlanmış olmaları gerekmediği ve bu nedenle yalnızca sorguda yoldaki boşluklar olarak yorumlanmaması gerektiği anlamına gelir.
tlrobinson

3
rfc 1738, artıları boşluk olarak kabul eder. Her şey kodlama / kod çözme işlevleriniz tarafından uygulanana bağlıdır. örneğin, php'de rawurlencode 17fc 1738'i takip ederken urlencode rfc 2396'yı takip eder.
Jonathan Fingland

1
Bak, şimdi biraz karışıklığım var. Yukarıda bana verdiğin örnekte, a.com% 2Fa% 2Bb istediğim gibi değil, en azından bir.com/a%2Bb olurdu. Bu, ele aldığım gerçek bir URL, bir sorgu dizesinde parametre olarak iletilen bir URL değil. Açıklığa kavuşmaya yardımcı olabilecek küçük bir arka plan için, Mac OS X Finder dosya sistemi URL'lerini bana geri veriyor. Bu yüzden "a? + B.txt" adında bir dosyam varsa, "file: //a%3F+b.txt" değil, "file: //a%3F%2B.txt" gibi görünen bir şey döndürür. . Bulucu sadece yanlış mı, yoksa sorgu dizesinden önce + bir artı mı?
Francisco Ryan Tolmasky

2
Jonathan: 1738'in + rezerve edildiğinden emin misin? Anlıyorum: safe = "$" | "-" | "_" | "" | "+" kaydedilmemiş = alfa | basamak | güvenli | Ayrıca, yalnızca alfasayısallar, "$ -_. +! * '()," özel karakterleri ve ayrılmış amaçları için kullanılan ayrılmış karakterler bir URL içinde kodlanmamış olarak kullanılabilir.
tlrobinson

2
"Her zaman kaçacaksın" daha fazla nitelik gerektirir ve cevap yine de soru ile ilgisizdir.
hata
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.