`+` ในแบบแผน URL / โฮสต์ / เส้นทางแสดงถึงช่องว่างหรือไม่?


224

ฉันทราบว่า+ในสตริงการสืบค้นของ URL แสดงถึงช่องว่าง นี่เป็นกรณีนอกขอบเขตข้อความค้นหาหรือไม่ กล่าวคือทำตาม URL ต่อไปนี้:

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

จริง ๆ แล้วเป็นตัวแทน:

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

(และดังนั้นจึงจำเป็นต้องเข้ารหัสถ้าจริงควรเป็น+) หรือในความเป็นจริงมันเป็นตัวแทนจริง ๆa+b/c?



4
โปรดทราบว่าใน php urldecode จะถอดรหัส% 2b (เข้ารหัส +) เป็นช่องว่าง เพื่อหลีกเลี่ยงการใช้งานrawurldecodeนี้ ฉันพูดที่นี่เพื่อการอ้างอิงเพราะนี่เป็นผลการจัดอันดับสูงในการค้นหาของ Google สำหรับ "php url ถอดรหัสตัวแบ่งในเครื่องหมายบวก"
danielson317

1
มีความเป็นไปได้ที่ซ้ำกันของเมื่อจะเข้ารหัสพื้นที่เป็นบวก (+) หรือ% 20
ผู้ใช้

คำตอบ:


170
  • เปอร์เซ็นต์การเข้ารหัสในส่วนเส้นทางของ URL ที่คาดว่าจะถอดรหัส แต่
  • +อักขระใด ๆในองค์ประกอบเส้นทางที่คาดว่าจะได้รับการปฏิบัติอย่างแท้จริง

ที่จะชัดเจน: +เป็นเพียงอักขระพิเศษในองค์ประกอบแบบสอบถาม


12
+1 น่าเสียดายที่มี "ตัวแปลงสัญญาณ / ตัวเข้ารหัส URL" จำนวนมากอยู่ในสถานะไม่เข้าใจ เช่นsislands.com/coin70/week6/encoder.htm keyone.co.uk/tools-url-encoder.asp meyerweb.com/eric/tools/dencoder
leonbloy

11
@Stobor: จำเป็นต้องมี
bukzor

8
@Stobor RFC เคยระบุว่า+ตัวละครนั้นถูกตีความว่าเป็นช่องว่างในองค์ประกอบการสืบค้นหรือไม่? หรือเป็นเพียงกฎ "จากป่า"?
Pacerier

44
@Pacerier และ @bukzor: RFC 1738 (ตามที่แก้ไขโดย 2396 และ 3986) กำหนดองค์ประกอบของ Scheme ( http:), Authority ( //server.example.com), และ Path ( /myfile/mypage.htm) และไม่ได้กำหนดความหมายพิเศษสำหรับ+ตัวละคร ข้อมูลจำเพาะ HTML กำหนดองค์ประกอบของแบบสอบถามให้เป็นแอปพลิเคชันประเภท mime / x-www-form-urlencodedซึ่งถูกกำหนดเป็น "แทนที่ช่องว่างด้วย+และอักขระพิเศษอื่น ๆ เช่นใน RFC1738" ดังนั้นจึงไม่ใช่ "มาจากป่า" แต่มาจากมาตรฐานที่ยอมรับ (ไม่ใช่ RFC)
Stobor

2
วิธีการ. NET Server.UrlEncodeเข้ารหัสช่องว่างอย่างผิดพลาดในส่วนของเส้นทางด้วยการละเมิดกฎ HTTP
Suncat2000

243

คุณสามารถค้นหารายการที่ดีของตัวละครที่เกี่ยวข้อง URL เข้ารหัสบนW3Schools

  • + กลายเป็น %2B
  • พื้นที่กลายเป็น %20

18
มันถูกกฎหมายอย่างสมบูรณ์สำหรับตัวอักษร '+' ที่จะปรากฏในส่วนประกอบเส้นทางใน URL
Sam Stainsby

4
เพื่อให้ได้ตัวอักษร + ที่จะได้รับจากส่วนหลัง (หรืออย่างน้อย PHP) จะต้องมีการเข้ารหัสสามครั้ง:%25252B
Umbrella

11
คำตอบนี้ไม่เกี่ยวข้องกับคำถามทั้งหมด
Nisse Engström

22

อักขระช่องว่างสามารถเข้ารหัสเป็น "+" ในบริบทเดียวเท่านั้น: แอปพลิเคชัน / x-www-form-urlencoded คู่คีย์ - ค่า

RFC-1866 (สเปค HTML 2.0), ย่อหน้า 8.2.1 อนุวรรค 1 กล่าวว่า: "ชื่อเขตข้อมูลฟอร์มและค่าจะถูก Escape: อักขระช่องว่างจะถูกแทนที่ด้วย` + 'แล้วตัวละครที่สงวนไว้จะถูกหลบหนี ")

นี่คือตัวอย่างของสตริงดังกล่าวใน URL ที่ RFC-1866 อนุญาตให้เข้ารหัสพื้นที่เป็น pluses: " http://example.com/over/there?name=foo+bar " ดังนั้นหลังจาก "?" ช่องว่างสามารถถูกแทนที่ด้วย pluses (ในกรณีอื่น ๆ ช่องว่างควรถูกเข้ารหัสเป็น% 20) วิธีการเข้ารหัสข้อมูลในแบบฟอร์มนี้ยังมีให้ในข้อกำหนด HTML ในภายหลังเช่นค้นหาย่อหน้าที่เกี่ยวข้องเกี่ยวกับ application / x-www-form-urlencoded ใน HTML 4.01 Specification และอื่น ๆ

แต่เนื่องจากเป็นการยากที่จะระบุบริบทอย่างถูกต้องเสมอจึงเป็นวิธีปฏิบัติที่ดีที่สุดที่จะไม่เข้ารหัสช่องว่างเป็น "+" จะดีกว่าการเข้ารหัสเปอร์เซ็นต์อักขระทั้งหมดยกเว้น "unreserved" ที่กำหนดใน RFC-3986, p.2.3 นี่คือตัวอย่างรหัสที่แสดงสิ่งที่ควรเข้ารหัส มันได้รับในภาษาการเขียนโปรแกรม Delphi (ปาสคาล) แต่มันง่ายมากที่จะเข้าใจวิธีการทำงานสำหรับโปรแกรมเมอร์ใด ๆ โดยไม่คำนึงถึงภาษาที่ครอบครอง:

(* 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

ใช้ฟังก์ชั่น encodeURIComponent เพื่อแก้ไข url ใช้งานได้บน Browser และ node.js

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
สิ่งนี้ไม่ได้ตอบคำถาม และเข้ารหัส URL อย่างไม่ถูกต้องด้วยภาษาเฉพาะ (JavaScript) - ขึ้นอยู่กับบริบทคุณอาจไม่ต้องการเข้ารหัสที่ที่คุณต้องการสแลชพิเศษ (ไม่ใช่ตัวอักษร) (/) และโคลอน (:) เพื่อให้ URL ใช้งานได้ .
Gremio

ขอบคุณจริงๆช่วยฉัน!
qwsd

-2

ลองด้านล่าง:

<script type="text/javascript">

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

2
ฉันคิดว่ามันแปลกมากที่คนสองคนโหวตให้คำตอบนี้ แท้จริงมันไม่มีอะไรเกี่ยวข้องกับคำถาม
Andrew Barber เมื่อ

1
สำหรับตัวละครอื่น ๆ * @ - _ + /
ราวี

1
@AndrewBarber ทำไมคุณถึงรู้สึกว่าไม่เกี่ยวข้อง? + กลายเป็น% 2B
The Java Guy

นี้เป็นธรรมด้วยเหตุผลหลายประการดังนั้น ... escapeจะเลิกแทนคุณควรใช้หรือในกรณีของส่วนแบบสอบถามencodeURI encodeURIComponentนอกจากนี้ยังสตริงพารามิเตอร์จะเข้ารหัสตามW3C
Christoph

-5

คุณจะเข้ารหัส URL ทุกครั้ง

นี่คือวิธีที่ Ruby เข้ารหัส URL ของคุณ:

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

8
ฉันไม่แน่ใจว่าถูกต้อง ตามที่ระบุไว้ใน RFC2396 ( ietf.org/rfc/rfc2396.txt ) คำพูเซ็ตไม่ใช่อักขระที่สงวนไว้ในพา ธ (เซกเมนต์) ของ URI ซึ่งเป็นเพียงองค์ประกอบคิวรีเท่านั้น ดูเหมือนจะแปลว่าพวกเขาไม่จำเป็นต้องเข้ารหัส URL ดังนั้นจึงไม่ควรตีความว่าเป็นช่องว่างในพา ธ เฉพาะในแบบสอบถาม
tlrobinson

3
rfc 1738 อย่างไรก็ตามจะถือว่า pluses เป็นช่องว่าง ทุกอย่างขึ้นอยู่กับการใช้งานโดยฟังก์ชันการเข้ารหัส / ถอดรหัสของคุณ ตัวอย่างเช่นใน php, rawurlencode ติดตาม rfc 1738 ในขณะที่ urlencode เป็นดังนี้ rfc 2396
Jonathan Fingland

1
ดูตอนนี้ฉันมีความสับสนเพิ่มเติม ในตัวอย่างที่คุณให้ไว้ข้างต้น a.com% 2Fa% 2Bb ไม่ใช่สิ่งที่ฉันต้องการอย่างน้อยที่สุดก็จะเป็น a.com/a%2Bb นี่เป็น URL จริงที่ฉันใช้ไม่ใช่ URL ที่ถูกส่งเป็นพารามิเตอร์ในสตริงการสืบค้น สำหรับพื้นหลังเล็ก ๆ ที่อาจช่วยให้กระจ่างได้ The Mac OS X Finder กำลังส่งคืน URL ของระบบไฟล์ให้ฉัน ดังนั้นหากฉันมีไฟล์ชื่อ "a? + b.txt" ก็จะส่งคืนบางสิ่งที่ดูเหมือน "file: //a%3F+b.txt" ไม่ใช่ "file: //a%3F%2B.txt" . ตัวค้นหานั้นไม่ถูกต้องหรือเป็น + ก่อนที่สตริงการสืบค้นจะเป็นเครื่องหมายบวกจริงหรือ
46499 Francisco Francisco Tolmasky ฉัน

2
โจนาธาน: คุณแน่ใจว่า 1738 กล่าวว่า + สงวนไว้ ฉันเห็น: safe = "$" | "-" | "_" | "" | "+" ไม่ได้จอง = alpha | ดิจิตัล ปลอดภัย พิเศษเช่นเดียวกับ: ดังนั้นตัวอักษรและตัวเลขเท่านั้นอักขระพิเศษ "$ -_. +! * '(),", และอักขระที่สงวนไว้ซึ่งใช้เพื่อวัตถุประสงค์ในการสงวนอาจถูกใช้โดยไม่มีการเข้ารหัสภายใน URL
tlrobinson

2
"เจ้าจะหนีไปตลอด" ต้องมีคุณสมบัติมากกว่านี้และคำตอบนั้นไม่เกี่ยวข้องกับคำถามต่อไป
ข้อผิดพลาด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.